2010-10-11 16 views
1

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

问题是,它的保留计数永远不会为零,所以方法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

检查您的控制器是否被某个其他类保留 - 可能是代表某事。 – Vladimir 2010-10-11 11:31:00

+0

对不起吃午饭,但你似乎已经修好了:) – willcodejavaforfood 2010-10-11 11:45:47

+0

是的,那完全是我的错误。天哪,我现在感觉超级笨拙,因为我花费了令人难以置信的时间寻找这个问题的根源。 – sniurkst 2010-10-11 11:48:00

回答

1

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

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

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

我会假设UIKit导航控制器没有错误(否则许多其他开发人员会抱怨它),并且在代码中的某处您将它保留在其他位置(可能没有意识到它,即代表财产宣布保留,而不是分配等)

希望帮助!

+1

保留代表正是我的问题。在我发布我的问题后,我决定添加自己的保留/释放方法并在其中打印retainCounts,所以在他们显示更疯狂的数字并“保留”一段时间后加起来之后,我发现这是因为愚蠢的我以某种方式添加保留而是分配给委托属性。该死的,现在我想切我的手指黑帮风格... – sniurkst 2010-10-11 11:47:06

+0

我们都做到了:) – deanWombourne 2010-10-11 11:53:06

+0

啊,不幸的是,我仍然得到记忆警告和崩溃,直到没有明白的想法为什么...好吧,至少那个代表部分现在是固定的。 (编辑:哈,看起来像我做到了 - 仍然有希望!) – sniurkst 2010-10-11 11:54:14