1

所以我的代码是这样的:

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 方法永远不会释放它们(保留计数永远不会下降到零),所以我认为这就是我试图解决的内存崩溃问题现在几天。

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

4

1 回答 1

2

这对我来说看起来不错。创建它后,“ac”的保留计数为 1,这是正确的。然后你将它推送到 app.nav 并在那里计算另外两个保留,这很好。该类有责任释放它保留的任何内容。最后你释放你创建的实例,保留计数下降到 2。但这两个计数不是你的责任,即 app.nav。

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

您需要做的就是为每个 alloc 发布一个版本,并且您已经做到了

于 2010-10-11T09:14:16.000 回答