请看下面的代码。这部分从堆栈中弹出顶视图控制器(通常是相同的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]
两次(这可能是件很糟糕的事情)?
答案 0 :(得分:1)
您如何知道导航控制器的保留计数为2不正确?
您不能依赖retainCount来执行alloc / release调试,因为我们不知道UIKit的内部是如何工作的。只要您在代码中保留并正确释放,您就可以99.9%确定UIKit也能正常工作。
我猜想popViewController将删除pushViewController添加的所有保留 - 即使我不知道会有多少 - 但它可能会将其设置为自动释放,因此您无法保证它会立即释放在调用popViewController之后。
我假设UIKit导航控制器没有错误(否则许多其他开发人员会抱怨它!)并且在你的代码中某处你将它保留在其他地方(可能没有意识到)它即声明保留而不是分配的委托属性等)
希望有所帮助!