在我的项目中我创建了一个类 viewTransistion
#import "viewTransition.h"
#import "quiz.h"
#import "mode.h"
#import "result.h"
#import "aboutGame.h"
#import "ViewController.h"
static UIView *cview=nil;
static quiz *quizObj=nil;
static mode *modeObj=nil;
static result *resultObj=nil;
static aboutGame *aboutGameObj=nil;
static ViewController *viewControllerObj=nil;
@implementation viewTransition
+(void) viewsTransitionCurrentView:(id)currentView toNextView:(NSString*)nextViewName
{
if(nextViewName == @"quiz")
{
quizObj = [[quiz alloc]init];
cview = quizObj.view;
NSLog(@"quizObj=%d", [quizObj retainCount]);
}
if(nextViewName == @"mode")
{
modeObj = [[mode alloc]init];
cview = modeObj.view;
NSLog(@"modeObj=%d", [modeObj retainCount]);
}
if(nextViewName == @"result")
{
resultObj = [[result alloc]init];
cview = resultObj.view;
NSLog(@"resultObj=%d", [resultObj retainCount]);
}
if(nextViewName == @"aboutGame")
{
NSLog(@"aboutGameObj=%d",[aboutGameObj retainCount]);
aboutGameObj = [[aboutGame alloc]init];
cview = aboutGameObj.view;
}
if(nextViewName == @"viewController")
{
viewControllerObj = [[ViewController alloc]init];
cview = viewControllerObj.view;
}
[UIView transitionFromView:[currentView view] toView:cview duration:2 options:UIViewAnimationOptionTransitionCurlUp completion:^(BOOL finished) {}];
[currentView release];
cview = nil;
}
@end
它的目的是执行 View 转换,这样我就不必再次编写代码
首先我将此类的方法和变量创建为非静态...
我检查了设备,我发现泄漏可能是因为我在 if 语句中分配初始化而不是释放对象
如果我在最后释放对象,我将无法执行 View 转换,因为在下一个我想要进入的 View 上被破坏了
......................................
检查我将此类方法和变量转换为静态,以便我可以检查保留计数
我转换为静态的原因...如果每次创建此类的新实例,我将始终获得当前实例的保留计数 1
现在我第一次执行这个它工作正常,但是如果你看看 aboutGame if block 第一次执行打印 0 下次如果我想再次进入这个页面,NSLog 行就会变成僵尸???
......................................
最后一行[currentViewrelease]是删除 Root View Controller ...但我没有分配init这个我不是所有者所以为什么我应该释放它..我在一本书中看到了释放 View 的代码 Controller 。
......................................
这是实现这种情况静态或非静态的最佳方式
我使用这个类方法和变量作为静态,它工作正常,没有泄漏,没有僵尸,没有问题???
最佳答案
一些观察:
类名应以大写字母开头
retainCount
没有用。不要调用它。如果您要重新分配实例变量(或全局变量),则应在分配之前释放旧值(这可能是内存泄漏的根源)。
你是对的;您不应该在该方法中释放
currentView
。
which is the best way to implement this kind of situation static or non-static
这个问题确实没有意义;它掩盖了对 View Controller 和内存管理在 iOS 上如何工作的误解。
如果可以的话,我建议您将项目转换为使用 ARC(自动引用计数)。这将主要为您处理内存管理(大多数情况下 - 您仍然需要考虑它,只是不那么机械)。
接下来,您将需要深入了解与 UIView 和 UIViewController 相关的“使用...编程”指南。
关于ios - 奇怪和陌生的内存行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558654/