所以我的代码是这样的:
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方法永远不会释放它们(保留计数永远不会降到零),所以我认为这里存在内存崩溃问题我试图现在解决了几天。
这是怎么回事?我可以做些更多的事来解决这个问题吗?
答案 0 :(得分:2)
这对我来说很好看。创建之后'ac'的保留计数为1是正确的。然后你把它推到app.nav并在那里再计算两个保留,这很好。该类的责任是释放它保留的内容。最后,你释放你创建的实例,并且保留计数下降到2.但这两个计数不是你的责任,即app.nav。
这就是为什么你不应该真的担心打印出retainCount,因为当你不知道另一个类的幕后发生了什么时,它看起来很奇怪。
您需要做的就是为每个分配一个版本而你已经完成了