基于视图的应用程序 - [window addSubview:viewController.view] 之后的 viewcontroller retainCount;
Posted
技术标签:
【中文标题】基于视图的应用程序 - [window addSubview:viewController.view] 之后的 viewcontroller retainCount;【英文标题】:view based application - viewcontroller retainCount after [window addSubview:viewController.view]; 【发布时间】:2010-08-07 13:00:16 【问题描述】:我有一个基于视图的应用程序,当我检查 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 文件是空白的....
【问题讨论】:
分配后的初始保留计数为 1。您不是在分配后立即记录,而是在一段时间后,当框架有机会执行一些活动时。同样,您不必担心保留计数,因为使用此技术您不太可能发现内存管理错误,只需遵循规则就可以了。 【参考方案1】:只要您遵循内存管理规则,您就不必担心对象的实际保留计数。框架可能会保留或释放对象,因此保留计数将不受您控制。
【讨论】:
好的,谢谢你的回复....但是我在其他一些dealloc方法上放了一些NSLOG,当我按下主页按钮时它们不会被调用....我应该担心吗? @costamatrix:如果它们在您的应用程序的整个生命周期中都存在,那么不用担心,系统会在您的应用程序终止后清理它们。如果在您的应用程序生命周期中应该动态创建和销毁某些东西并且您没有看到调用 dealloc 方法,那么您应该开始担心了。【参考方案2】:终止应用程序时,您可能不会调用 dealloc。这不是测试的方法。并且根视图控制器始终存在于应用程序中。您应该关注您自己创建的其他类,并确保它们的 dealloc 在它们应该被调用时被调用(而不是在终止时)。而且也不要依赖retainCount。 Apple 建议不要在任何地方使用它。
假设您有两个视图和对应的视图控制器,而不是根视图控制器。在第一个视图中,您创建了其他对象。现在,当切换到第二个视图时,如果没有必要,您应该为第一个视图释放内存。在这种情况下,您应该测试第一个视图的对象是否真的被释放了。如果您以这种方式编码但没有被调用,那么一定有泄漏。但是,是的,您不应该在应用程序终止时对此进行测试。
【讨论】:
以上是关于基于视图的应用程序 - [window addSubview:viewController.view] 之后的 viewcontroller retainCount;的主要内容,如果未能解决你的问题,请参考以下文章
性能优化懒懒加载懒动画 --- 基于window滚动事件来实时更新DOM的视图状态,以表明是否在规定的可视区,并作有change回调