当_existingView消息发送到解除分配的对象时,为什么iPhone的旋转会导致崩溃?

时间:2009-11-20 13:21:45

标签: iphone uiview uiviewcontroller

我有两个视图控制器:MyParentViewControllerMyChildViewController

应用程序以MyParent开头。我将MyChild控制器推到导航堆栈的顶部,这样链就像这样:

MyParent> MyChild

我使用MyChild

记录NSLog(@"%p", self)的对象ID
2009-11-20 05:08:29.305 MyApp[2213:207] MyChildViewController instance: 0x36afc20

当我从MyChild按下后退按钮时,会从堆栈中弹出MyChild并返回MyParent

在查看MyParent时旋转iPhone时,我的应用程序崩溃并显示以下错误消息:

2009-11-20 05:08:37.671 MyApp[2213:207] *** -[MyChildViewController _existingView]: message sent to deallocated instance 0x36afc20

_existingView中没有MyChildViewController方法或实例变量。

如果我从堆栈中弹出MyChild,我认为导航控制器会释放它,并且我认为它将被设置为nil,并且发送给它的任何消息都将被忽略。虽然这不会发生在这里,显然。

有没有人有任何想法为什么我的应用程序在轮换时崩溃?

有没有办法找出将_existingView邮件发送到MyChild的内容?

修改

以下是在堆栈上推送MyChild的代码:

MyChildViewController *_myChildViewController = [[MyChildViewController alloc] initWithNibName:@"MyChildViewController" bundle:nil];
_myChildViewController.managedObjectContext = self.managedObjectContext;
_myChildViewController.title = [_xyz name];
[self.navigationController pushViewController:_myChildViewController animated:YES];
UIBarButtonItem *_backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"MyChildViewBackBarButtonItemTitle", @"") style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.backBarButtonItem = _backButton;
[_backButton release];
[_myChildViewController release];

编辑2

我可能已经解决了这个问题。我通过Interface Builder将UISearchDisplayController添加到视图控制器nib中。

最初,我在nil控制器发送MyChild时将其设置为-viewDidUnload,认为通常在此方法中将IBOutlet个实例设置为nil。但这对我的搜索显示控制器来说似乎不够。当我在-dealloc中发布时,我没有得到崩溃。这是一个错误,我想知道,还是预期的行为?

3 个答案:

答案 0 :(得分:1)

有一种方法可以找到更多关于谁打电话(找到here):

  

[...]此外,到应用程序时   由于未被捕获而终止   例外没有用   回溯。如果设置断点   objc_exception_throw调试器将   在抛出异常之前中断   你将有一个有用的回溯。一世   使用.gdbinit文件执行此操作。创建一个   名为.gdbinit的文件并将其放入   你的主目录。这是   我的内容:

     
      
  • fb - [NSException raise]
  •   
  • fb - [_ NSZombie release]
  •   
  • fb szone_error
  •   
  • fb objc_exception_throw
  •   
     

也可以设置这些类型   Xcode中的断点   断点窗口或在调试器中   安慰。 [...]

但我认为这不会解决你的问题......在旋转手机时,框架似乎会调用_existingView。我能想到告诉框架在_myChildController上执行此操作的唯一一行就是这一行:

myChildViewController.managedObjectContext = self.managedObjectContext;

没有它可行不通吗?

答案 1 :(得分:0)

我也在努力解决这个问题,解决方案与Alex Reynolds相似。我在-dealloc方法上释放了我的UISearchDisplayController,但它必须是之前的 [super dealloc]。如果我在超级重新分配后发布,它仍然会崩溃。

答案 2 :(得分:0)

_existingView是UIViewController实例的内部变量,在UIViewController.h中定义 也许您将MyChildViewController保留在代码中的某个位置。