1

我有一个基于视图的应用程序,当我检查 dealloc 方法是否正常工作时,我发现它没有...调试和调试,然后使用retainCount,我发现我的视图控制器retaincount 在程序启动时变得疯狂......它很容易复制....

只需启动一个新的基于视图的应用程序模板,并在 didFinishLaunchingWithOptions 中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after app launch. 
 NSLog(@"i1 %i",[viewController retainCount]);
    [window addSubview:viewController.view];
 NSLog(@"i2 %i",[viewController retainCount]);
    [window makeKeyAndVisible];

 return YES;
}

我上了控制台:

[Session started at 2010-08-07 09:57:34 -0300.]
2010-08-07 09:57:35.132 teste1[20367:207] i1 2
2010-08-07 09:57:35.138 teste1[20367:207] i2 8

这是正确的吗?

然后当我按下 iphone 主页按钮关闭应用程序时,dealloc 方法永远不会被调用,我相信因为 viewController 的 retainCount .... 我是对的?

这是苹果的视图应用程序模板……应该可以……不是吗?

有人能解释一下为什么最初的retaincount是2吗??????还有8个???xib 文件为空....

4

2 回答 2

2

只要您遵循内存管理规则,您就不必担心对象的实际保留计数。框架可能会保留或释放对象,因此保留计数将不受您的控制。

于 2010-08-07T13:03:38.487 回答
1

终止应用程序时,您可能不会调用 dealloc。这不是测试的方法。并且根视图控制器始终存在于应用程序中。您应该关注您自己创建的其他类,并确保它们的 dealloc 在它们应该被调用时被调用(而不是在终止时)。而且也不要依赖retainCount。Apple 建议不要在任何地方使用它。

假设您有两个视图和相应的视图控制器,而不是根视图控制器。在第一个视图中,您创建了其他对象。现在,当切换到第二个视图时,如果没有必要,您应该为第一个视图释放内存。在这种情况下,您应该测试第一个视图的对象是否真的被释放了。如果您以这种方式编码但没有被调用,那么一定有泄漏。但是,是的,您不应该在应用程序终止时对此进行测试。

于 2010-08-07T16:37:57.073 回答