防止 uinavigationcontroller 设置中 popViewControllerAnimated 的错误访问崩溃
Posted
技术标签:
【中文标题】防止 uinavigationcontroller 设置中 popViewControllerAnimated 的错误访问崩溃【英文标题】:Preventing bad access crash for popViewControllerAnimated in uinavigationcontroller setup 【发布时间】:2011-04-03 08:33:48 【问题描述】:因此,在内存不足的情况下,我的根视图被卸载。这是意料之中的,并且已经考虑到了。但是,我该如何处理需要弹出的模态/推送视图控制器,因为它们引用了主导航控制器?我在推送视图控制器中有一个自定义完成按钮,它调用 [self.navigationController popViewControllerAnimated:YES]。如果根视图已被卸载,则会出现错误的访问错误。有没有更好的方法来做到这一点?
我的设置是 AppDelegate 有一个 NavigationController 这个 NavigationController 有一个视图控制器 MainViewController
//MainViewController.m
- (IBAction)showAnotherController:(id)sender
AnotherViewController * anotherViewController;
anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
[self.navigationController pushViewController:anotherViewController animated:YES];
[anotherViewController release];
//...Here I can simulate a memory warning to force unloading of MainViewController's view
//in AnotherViewController.m, called from a custom toolbar item
- (IBAction)done:(id)sender
[self.navigationController popViewControllerAnimated:YES]; // bad access here, looks like self.navigationController is no longer available. Am I doing this wrong?
【问题讨论】:
viewDidUnload 方法只是卸载视图控制器的视图,而不是视图控制器本身。根控制器必须在那里。你能发布崩溃吗? 确实如此。我刚刚得到一个 EXC_BAD_ACCESS,调试器卡在 [self.navigationController popViewControllerAnimated:YES] 线上,因为 self.navigationController 不再存在。 【参考方案1】:您描述的场景不会导致错误访问。但是,如果您不仔细处理所描述的场景,您将无法访问。由于您没有向我展示任何代码,我无法告诉您这是您遇到的问题,但这是一个非常常见的问题。
当你收到内存警告并且你的视图被卸载时,你可能释放了一堆东西。除了释放变量之外,您还必须将它们设置为 nil。如果不这样做,您将面临向已释放对象发送消息的风险,这会导致访问不正确。
同样,我不知道这是您的问题,但通常是问题所在。
编辑:既然你似乎相信self.navigationController
不存在(它可能确实存在)我要告诉你一个叫做 NSZombie 的东西:
NSZombie 会告诉你正在向哪个释放对象发送消息(又名 EXC_BAD_ACCESS)。当您获得 EXC_BAD_ACCESS 时,这是一个非常有用的工具,因此请学习如何使用它。
要激活 NSZombie,请执行以下操作:
-
获取可执行文件的信息。
转到参数选项卡。
在“要在环境中设置的变量:”部分添加:
名称:NSZombieEnabled 值:是
然后像往常一样运行你的应用程序,当它崩溃时它应该告诉你哪个被释放的对象收到了消息。
【讨论】:
我在原始问题中添加了更多代码。让我知道这是否足够。 恐怕这不是相关代码。我对视图的加载和卸载更感兴趣。试试 NSZombie 并告诉我结果。 谢谢,伙计。这就是我需要的建议。我应该尝试的东西,但误解了错误。使用 NSZombieEnabled,我看到一些“[SomeUIControl autorelease]: message sent to deallocated instance”错误。我认为这可能是因为我的 IBOutlets 没有为它们设置相应的属性。 @akaru 不客气。如果您发现我的回答有帮助,也许您应该投票和/或接受它。 这没什么好玩的,但是,是的,我最终发现了我的错误,这实际上不是调试器输出的内容。正如预期的那样,视图控制器仍然存在。使用 NSZombieEnabled,我发现一个对象被释放了两次,就是这样。以上是关于防止 uinavigationcontroller 设置中 popViewControllerAnimated 的错误访问崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在iOS 7中隐藏状态栏时防止UINavigationController调整原点
双击UITabBarController时防止自动popToRootViewController