防止在uinavigationcontroller安装程序中对popViewControllerAnimated进行错误的访问崩溃

所以,在低内存下,我的根视图被卸载。 这是预期的和占的。 但是,如何处理需要popup的模式/推式视图控制器,因为它们引用了主navigationController? 我有一个自定义完成button在推视图控制器,它调用[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? } 

您描述的情况不会导致访问不良。 但是,如果您不仔细处理所描述的情况,则会导致访问不良。 既然你没有告诉我任何代码,我不能告诉你这是你遇到的问题,但这是一个非常普遍的问题。

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

再次,我不知道这是你的问题,但通常是问题。

编辑:因为你似乎相信self.navigationController不存在(它可能会)我要告诉你有关NSZombie的东西:

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

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

  1. 获取可执行文件的信息。
  2. 转到参数选项卡。
  3. 在“要在环境中设置的variables”部分中添加:

名称:NSZombieEnabled值:是

然后像往常一样运行你的应用程序,当它崩溃时,应该告诉你哪个释放对象收到消息。