当我通过以下方式解雇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报告的图像:
答案 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。
我希望这对你有益,就像对我一样。它使你的代码更干净!