如何修复奇怪的保留计数(1 init - 3 retaincount)? +编辑:dealloc问题

时间:2010-10-11 09:07:12

标签: iphone ipad memory-management retain dealloc

所以我的代码是这样的:

ArticleControllerController *ac = [[ArticleControllerController alloc] init];
ac.categoryIndex = idx;
NSLog(@"acc retain: %d", [ac retainCount]);        
[app.nav pushViewController:ac animated:NO];
NSLog(@"acc retain: %d", [ac retainCount]);        
[ac release];
NSLog(@"acc retain: %d", [ac retainCount]);    

我得到了:

[2649:207] acc retain: 1
[2649:207] acc retain: 3
[2649:207] acc retain: 2    

如何解决这个烂摊子?我不明白我做错了什么,这部分有时会导致应用程序因内存不足而崩溃。

编辑:相关问题。

所以情况与上面定义的相同,但问题是ArticleControllerController dealloc方法永远不会被调用。

更多代码:

- (void) navigateToNewsCategoryByIndex:(int)idx {
[app.nav popViewControllerAnimated:NO]; 

currentMode = MODE_ARTICLE;
ArticleControllerController *ac = [[ArticleControllerController alloc] init];
ac.categoryIndex = idx;
[app.nav pushViewController:ac animated:NO];
[ac release];
return ;        

}

如果这个方法重复多次,ArticleControllerController会创建大量的各种接口元素,但是它的dealloc方法永远不会释放它们(保留计数永远不会降到零),所以我认为这里存在内存崩溃问题我试图现在解决了几天。

这是怎么回事?我可以做些更多的事来解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

这对我来说很好看。创建之后'ac'的保留计数为1是正确的。然后你把它推到app.nav并在那里再计算两个保留,这很好。该类的责任是释放它保留的内容。最后,你释放你创建的实例,并且保留计数下降到2.但这两个计数不是你的责任,即app.nav。

这就是为什么你不应该真的担心打印出retainCount,因为当你不知道另一个类的幕后发生了什么时,它看起来很奇怪。

您需要做的就是为每个分配一个版本而你已经完成了