在uinavigationcontroller设置中防止popViewControllerAnimated的错误访问崩溃

时间:2011-04-03 08:33:48

标签: iphone ios uiviewcontroller uinavigationcontroller crash

因此,在内存不足的情况下,我的根视图会被卸载。这是预期和解释的。但是,我如何处理需要弹出的模态/推送视图控制器,因为它们引用了主导航控制器?我在推送视图控制器中有一个自定义完成按钮,它调用[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?

}

1 个答案:

答案 0 :(得分:2)

您描述的方案不会导致错误访问。但是,如果您未仔细处理所描述的方案,则会获得错误的访问权限。既然您没有向我展示任何代码,我无法告诉您这是您遇到的问题,但这是一个非常常见的问题。

当您收到内存警告并且卸载了视图时,您可能会发布一堆内容。除了释放变量之外,您还必须将它们设置为nil。如果不这样做,您将面临向已发布对象发送消息的风险,这会导致访问不良。

同样,我不知道这是你的问题,但通常是问题所在。

编辑:由于您似乎认为self.navigationController不存在(可能确实如此),我会告诉您一些名为NSZombie的事情:

NSZombie会告诉你发布的消息对象是什么(又名EXC_BAD_ACCESS)。当你获得EXC_BAD_ACCESS时,这是一个非常有用的工具,所以学习如何使用它。

要激活NSZombie,请执行以下操作:

  1. 获取可执行文件的信息。
  2. 转到参数选项卡。
  3. 在“要在环境中设置的变量:”部分添加:
  4. 名称:NSZombieEnabled 价值:是

    然后像往常一样运行您的应用程序,当它崩溃时,它应该告诉您哪个已解除分配的对象收到了该消息。