防止在uinavigationcontroller设置中popViewControllerAnimated的访问不良崩溃

问题描述:

因此,在内存不足的情况下,我的根视图被卸载。这是预料之中的事情。但是,如何处理需要弹出的模式/推式视图控制器,因为它们引用主navigationController?我在推视图控制器中有一个自定义完成按钮,它调用[self.navigationController popViewControllerAnimated:YES]。如果根视图已被卸载,则会导致访问错误。有一个更好的方法吗?防止在uinavigationcontroller设置中popViewControllerAnimated的访问不良崩溃

我的设置是 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? 

} 
+0

viewDidUnload方法只是卸载视图控制器的视图,而不是视图控制器本身。根控制器必须在那里。你可以发布崩溃? – Jorge 2011-04-03 10:13:32

+0

的确如此。因为self.navigationController不再存在,所以我只是在调试器卡在行[self.navigationController popViewControllerAnimated:YES]时得到一个EXC_BAD_ACCESS。 – akaru 2011-04-03 19:24:55

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

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

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

编辑:既然你似乎认为self.navigationController不存在(它可能做)我会告诉你什么叫NSZombie:

NSZombie会告诉你什么释放的对象被发送消息(又名EXC_BAD_ACCESS)。当您获得EXC_BAD_ACCESS时,这是一个非常有用的工具,因此请了解如何使用它。

要激活NSZombie做到以下几点:

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

名称:NSZombieEnabled 值:是

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

+0

我在原始问题中增加了一些代码。让我知道这是否足够。 – akaru 2011-04-03 19:29:52

+0

这不是我害怕的相关代码。我对装载和卸载视图更感兴趣。试试NSZombie并告诉我结果。 – 2011-04-03 22:02:51

+0

谢谢,伙计。这是我需要的建议。我应该尝试的东西,但误解了错误。使用NSZombieEnabled,我看到一些“[SomeUIControl autorelease]:发送到释放实例的消息”错误。我认为这可能是由于我的IBOutlets没有为他们设置相应的属性。 – akaru 2011-04-04 03:26:54