1

请看下面我的代码。这部分从堆栈中弹出顶视图控制器(通常相同ArticleControllerController)(我发现无论是弹出单个控制器还是弹出到根控制器,问题都保持不变),创建新控制器并添加到堆栈中。

问题是,它的保留计数永远不会变为零,因此永远不会调用deallocof 方法,从而ArticleControllerController使大量的各种接口对象未释放。由于内存不足,最终应用程序崩溃(至少在设备中,至少我认为这部分是主要问题)。

- (void) navigateToNewsCategoryByIndex:(int)idx {
    [app.nav popViewControllerAnimated:NO]; // could be popToRootController
    ArticleControllerController *ac = [[ArticleControllerController alloc] init];
    ac.categoryIndex = idx;
    [app.nav pushViewController:ac animated:NO];
    [ac release];
    NSLog(@"AC retain count: %d", [ac retainCount]); // prints 2
} 

所以,我猜,popViewControllerAnimated 只发布了其余两个保留中的一个。为什么?我应该寻找什么?我能做些什么?打电话[ac release]两次(那将是可怕的事情)?

4

1 回答 1

1

你怎么知道保留计数为 2 不是导航控制器的正确行为?

你不能依赖retainCount 来进行分配/释放调试,因为我们不知道UIKit 的内部是如何工作的。只要您在代码中正确地保留和释放,您就可以 99.9% 确定 UIKit 也将正常工作。

我猜想 popViewController 将删除 pushViewController 添加的所有保留 - 即使我不知道会有多少保留 - 但它可能会将其设置为自动释放,因此您不能保证它会在调用后立即释放到popViewController。

我会假设 UIKit 导航控制器没有错误(否则很多其他开发人员会抱怨它!)并且在你的代码中的某个地方你将它保留在其他地方(可能没有意识到它,即声明为保留而不是分配等的委托属性)

希望有帮助!

于 2010-10-11T11:31:26.447 回答