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

当_existingView消息发送到解除分配的对象时,为什么iPhone的旋转会导致崩溃?,iphone,uiview,uiviewcontroller,Iphone,Uiview,Uiviewcontroller,我有两个视图控制器:MyParentViewController和MyChildViewController 该应用程序以MyParent开始。我将MyChild控制器推到导航堆栈的顶部,因此链如下所示: MyParentMyChild 我使用NSLog(@“%p”,self)记录MyChild的对象ID: 当我从MyChild按下后退按钮时,这会将MyChild弹出堆栈,并将我返回到MyParent 当我在查看MyParent时旋转iPhone时,我的应用程序会崩溃,并显示以下错误消息: 20

我有两个视图控制器:
MyParentViewController
MyChildViewController

该应用程序以
MyParent
开始。我将
MyChild
控制器推到导航堆栈的顶部,因此链如下所示:

MyParent
MyChild

我使用
NSLog(@“%p”,self)
记录
MyChild
的对象ID:

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

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

2009-11-20 05:08:37.671 MyApp[2213:207] *** -[MyChildViewController _existingView]: message sent to deallocated instance 0x36afc20
我在
MyChildViewController
中没有
\u existingView
方法或实例变量

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

有人知道为什么我的应用程序在轮换时崩溃吗

有没有办法找出是什么将
\u 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


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

\u existingView
是UIViewController实例的内部变量,在
中定义
可能您正在代码中的某个地方保留您的
MyChildViewController

\u existingView
是UIViewController实例的内部变量,在

可能您正在代码中的某个位置保留您的
MyChildViewController

有一种方法可以了解有关谁打电话(找到)的更多信息:

[…]而且,当应用程序启动时 由于未捕获而终止 例外:没有有用的东西 回溯。如果在上设置断点 objc_异常_抛出调试器将 在引发异常之前中断 你会有一个有用的回溯。我 使用.gdbinit文件执行此操作。创建一个 文件名为.gdbinit并将其放入 您的主目录。这是 矿山内容:

  • fb-[N异常升高]
  • fb-[[NSU僵尸发布]
  • fb-szone_错误
  • fb objc_异常_抛出
也可以设置这些类型 Xcode中断点的数目 “断点”窗口或调试器中的 安慰[……]

但我想这不会解决你的问题_旋转手机时,框架似乎会调用existingView。我能想到的唯一一句话是告诉框架在myChildController上执行此操作:

myChildViewController.managedObjectContext = self.managedObjectContext;

如果没有这个,它不工作吗?

有一种方法可以了解有关谁打电话(找到)的更多信息:

[…]而且,当应用程序启动时 由于未捕获而终止 例外:没有有用的东西 回溯。如果在上设置断点 objc_异常_抛出调试器将 在引发异常之前中断 你会有一个有用的回溯。我 使用.gdbinit文件执行此操作。创建一个 文件名为.gdbinit并将其放入 您的主目录。这是 矿山内容:

  • fb-[N异常升高]
  • fb-[[NSU僵尸发布]
  • fb-szone_错误
  • fb objc_异常_抛出
也可以设置这些类型 Xcode中断点的数目 “断点”窗口或调试器中的 安慰[……]

但我想这不会解决你的问题_旋转手机时,框架似乎会调用existingView。我能想到的唯一一句话是告诉框架在myChildController上执行此操作:

myChildViewController.managedObjectContext = self.managedObjectContext;

如果没有这个,它不工作吗?

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

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

我也这么认为。你知道是什么在发送此消息吗?据我所知,我没有主动保留
MyChildViewController
。它在导航控制器取得所有权后立即发布。我也这么认为。你知道是什么在发送此消息吗?据我所知,我没有主动保留
MyChildViewController
。它在导航控制器取得所有权后立即发布。当按下childViewController时,代码到底是什么样子的?childViewController是parentViewController类的字段吗?当按下childViewController时,代码是什么样子的?childViewController是parentViewController类的字段吗?