在释放消息之后保留视图控制器的计数不等于零

时间:2012-01-01 11:07:55

标签: iphone objective-c ios

我有一个像这样初始化的视图控制器:HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];

然后我在使用此视图控制器后放置了此方法:[homeVC release]; 并且在它之后我放置了NSLog@("%d",[homeVC retainCount]);控制台显示15作为retainCount号码,但是,我添加了两个[homeVC release];行和相同的NSLog语句,结果= app崩溃......

两个问题:

1)任何人都可以解释一下吗?

2)如何使retainCount等于零?

2 个答案:

答案 0 :(得分:6)

  1. iOS SDK内部代码的各个部分可以/将保留您的视图控制器,特别是如果您正在推送它,以模态方式呈现它,将其与选项卡控件相关联,或者做其他任何其他操作与它无关紧要的事情。简而言之,您并不是唯一一个使用视图控制器的人。而且你的崩溃只是因为添加第二个版本导致视图控制器最终被释放太多次了。

    此外,通常不建议手动检查对象的保留计数,特别是因为这种情况下实际值与开发人员可能期望的值不匹配。

  2. 通过调用alloc/init来匹配每个retaincopyrelease,并且不必担心保留计数何时达到零(如果您真的想知道何时发生这种情况,请在dealloc中设置断点)。您必须编写不泄漏或过度释放对象的代码,假设iOS SDK将执行相同的操作,并相信您的对象将在正确的时间点发布。或者,切换到SDK版本5并改为使用自动垃圾回收。

答案 1 :(得分:2)

请勿使用retainCount 。这毫无意义。只需按照memory management rules,当您是所有者时即可发布,您就可以了。