请协助modalViewController崩溃

时间:2011-12-04 14:53:26

标签: iphone crash modalviewcontroller retain presentmodalviewcontroller

当我通过以下方式解雇ModalViewController时,我的应用程序崩溃了:

[self.parentViewController dismissModalViewControllerAnimated:YES];

当用户点击UINavigationController(“NavRoot”)的一个单元格时,会显示这个模态视图控制器(“MVC”) - 这是代码:

MVC *modalView = [[MVC alloc] initWithNibName:@"MVC" bundle:nil];
[self.navigationController presentModalViewController: modalView animated:YES];
[modalView release];         

加载的“modalView”只包含2个对象:一个UIWebView对象和一个“DONE”按钮,当点击它时会通过以下方式解决:

[self.parentViewController dismissModalViewControllerAnimated:YES];

除非我点击“完成” - 应用程序崩溃。

当我使用NSZombies运行Instruments时,我确实看到保留计数达到-1但我无法分辨是什么导致了这种过度释放。

我发现解决问题的唯一方法就是在“NavRoot”中添加一个“[modalView retain]”语句 - 这是一个用于呈现modalView的viewController:

MVC *modalView = [[MVC alloc] initWithNibName:@"MVC" bundle:nil];
[self.navigationController presentModalViewController: modalView animated:YES];
[modalView retain];  //  <<== new 'retain' statement
[modalView release];

或者只是从不首先发布modalView:

MVC *modalView = [[MVC alloc] initWithNibName:@"MVC" bundle:nil];
[self.navigationController presentModalViewController: modalView animated:YES];
// commenting out the 'release':
// [modalView release];

当我运行“Analyze”(“在第34行分配的对象的潜在泄漏”......)时,这两个选项都会抛出标记但是它们确实解决了问题。 不过,我担心这会导致Apple从App Store拒绝该应用程序。

关于可能导致过度释放的任何想法?或者我如何进一步尝试隔离/识别问题?

附上Instruments / Zombies报告的图像: enter image description here

4 个答案:

答案 0 :(得分:1)

您使用的是iOS 5吗?当我将应用程序从ios4切换到5时,我遇到了同样的问题。

ParentViewController现在称为presentsViewController

你可以做的虽然在你的模态视图中只是调用[self dismissModalViewController]而它应该解雇自己。我不是100%关于这一点,不能检查,因为我不在我的Mac附近,但我记得在文档中阅读它,

答案 1 :(得分:0)

如果你这样做

[self.navigationController presentModalViewController: modalView animated:YES];

然后你应该像

一样解雇它

[self.navigationController dismissModalViewControllerAnimated:YES];

而不是

[self.parentViewController dismissModalViewControllerAnimated:YES];

你想在哪里解雇视图?实际的modalView还是parentView?在我看来,你试图解雇一个已经被解雇并随后被释放的模态视图。

答案 2 :(得分:0)

要解雇modalViewController,我只需执行:[self dismissModalViewControllerAnimated:YES];

答案 3 :(得分:0)

[self dismissModalViewControllerAnimated:YES]无法在iOS 5上运行。

我已经在iOS 4上构建了一个添加presentingViewController的类别。(它在iOS 5上禁用了自己。)

只需包含2个文件,即可无缝运行。

请参阅backward-modal

我希望这对你有益,就像对我一样。它使你的代码更干净!