我有两个视图控制器:MyParentViewController
和MyChildViewController
。
应用程序以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
中发布时,我没有得到崩溃。这是一个错误,我想知道,还是预期的行为?
答案 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)
_existingView
是UIViewController实例的内部变量,在UIViewController.h中定义
也许您将MyChildViewController
保留在代码中的某个位置。
答案 2 :(得分:0)
我也在努力解决这个问题,解决方案与Alex Reynolds相似。我在-dealloc方法上释放了我的UISearchDisplayController,但它必须是之前的 [super dealloc]。如果我在超级重新分配后发布,它仍然会崩溃。