防止在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?
}
您所描述的情况下不会引起不良访问视图控制器。但是,如果您不仔细处理所描述的情况,就会导致访问不畅。既然你没有告诉我任何代码,我不能告诉你这是你遇到的问题,但这是一个非常普遍的问题。
当您收到内存警告并且您的视图已卸载时,您可能会释放一堆内容。除了释放变量之外,还必须将它们设置为零。如果你不这样做,你将面临将消息发送到释放对象的风险,这会导致访问不良。
同样,我不知道这是你的问题,但它通常是问题所在。
编辑:既然你似乎认为self.navigationController
不存在(它可能做)我会告诉你什么叫NSZombie:
NSZombie会告诉你什么释放的对象被发送消息(又名EXC_BAD_ACCESS)。当您获得EXC_BAD_ACCESS时,这是一个非常有用的工具,因此请了解如何使用它。
要激活NSZombie做到以下几点:
- 获取可执行的信息。
- 转到参数选项卡。
- 在“变量在环境中进行设置:”部分添加:
名称:NSZombieEnabled 值:是
然后运行你的应用程序像往常一样,当它崩溃,它会告诉你哪个解除分配的对象收到消息。
viewDidUnload方法只是卸载视图控制器的视图,而不是视图控制器本身。根控制器必须在那里。你可以发布崩溃? – Jorge 2011-04-03 10:13:32
的确如此。因为self.navigationController不再存在,所以我只是在调试器卡在行[self.navigationController popViewControllerAnimated:YES]时得到一个EXC_BAD_ACCESS。 – akaru 2011-04-03 19:24:55