UIViewController保留问题:count永远不会达到零

时间:2010-10-11 11:19:52

标签: iphone ipad memory-management retain

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

问题是,它的保留计数永远不会为零,因此永远不会调用dealloc 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]两次(这可能是件很糟糕的事情)?

1 个答案:

答案 0 :(得分:1)

您如何知道导航控制器的保留计数为2不正确?

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

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

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

希望有所帮助!