好的,我刚刚开始iOS开发。我将首先解释我的应用程序的流程:
1。加载了一个名为“appViewController”的视图。
2。 [self presentViewController: controller animated: YES completion:nil];
这会加载webview
3。完成webview后,我将其解雇并以这种方式加载新的UINavigation:
[self dismissViewControllerAnimated:YES completion:^{
formViewController *fv = [ [formViewController alloc] init ];
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:fv] autorelease];
navController.navigationBar.hidden = YES;
[presentingViewController presentModalViewController:navController animated:YES];
}];
5. formViewController有一个按钮,它附有一个事件,以便以这种方式显示警告
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Oops!"
message:@"test"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[av show];
到目前为止,一切都按预期工作。现在,当我单击“确定”(取消)按钮时,应用程序崩溃,NSZombieEnabled说明了 - [appViewController _deepestDefaultFirstResponder]:发送到解除分配的实例0x6e6a570 lldb的消息
这里发生了什么?为什么要再次向appViewController发送消息? [av show]
之后没有代码注意:我正在使用ARC
答案 0 :(得分:1)
如果您正在使用arc,则代码中的自动释放无效。
这看起来像你的根视图控制器在某些时候被解除分配,当响应者链被遍历时,得到的悬空指针被访问。
为了验证这一点,我将在appViewController上实现dealloc方法并查看它是否被调用。
dealloc {
NSLog(@"Problems ahead.");
}
如果在您希望发生这种情况之前调用它(对于根视图控制器可能根本没有),您需要找出发生这种情况的原因。你可能在某个地方缺少一个强大的参考。检查应用程序委托并验证您是否具有对该窗口的强引用,并且您将控制器设置为根视图控制器(假设您没有使用故事板)。
Zombies乐器非常适合调试这些问题。它将列出您有问题的对象的所有保留和释放。 Here's a short introduction to it
答案 1 :(得分:0)
有几件事。
您正在混合presentViewController和presentModalViewController。如果您是iOS新手,则应始终使用presentViewController。无需习惯使用即将弃用的方法(请参阅此问题的答案Difference between presentModalViewController and presentViewController?
一般情况下,除非绝对必须,否则不应自动释放。因为当一个控制器出现presentViewController(和presentModalViewController)时,它被保留,你可以随后轻松释放。我会像这样重组:
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:fv]; navController.navigationBar.hidden = YES; [presentingViewController presentModalViewController:navController animated:YES]; [navController release];
3 ..您所包含的代码部分位于何处?就像,你按一个按钮,视图被解雇或什么?