UIAlertView取消按钮崩溃应用程序

时间:2012-08-21 16:36:39

标签: ios automatic-ref-counting uialertview nszombie

好的,我刚刚开始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

2 个答案:

答案 0 :(得分:1)

如果您正在使用arc,则代码中的自动释放无效。

这看起来像你的根视图控制器在某些时候被解除分配,当响应者链被遍历时,得到的悬空指针被访问。

为了验证这一点,我将在appViewController上实现dealloc方法并查看它是否被调用。

dealloc {
  NSLog(@"Problems ahead.");
}

如果在您希望发生这种情况之前调用它(对于根视图控制器可能根本没有),您需要找出发生这种情况的原因。你可能在某个地方缺少一个强大的参考。检查应用程序委托并验证您是否具有对该窗口的强引用,并且您将控制器设置为根视图控制器(假设您没有使用故事板)。

Zombies乐器非常适合调试这些问题。它将列出您有问题的对象的所有保留和释放。 Here's a short introduction to it

答案 1 :(得分:0)

有几件事。

  1. 您正在混合presentViewController和presentModalViewController。如果您是iOS新手,则应始终使用presentViewController。无需习惯使用即将弃用的方法(请参阅此问题的答案Difference between presentModalViewController and presentViewController?

  2. 一般情况下,除非绝对必须,否则不应自动释放。因为当一个控制器出现presentViewController(和presentModalViewController)时,它被保留,你可以随后轻松释放。我会像这样重组:

  3. UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:fv];
    navController.navigationBar.hidden = YES;
    [presentingViewController presentModalViewController:navController animated:YES];
    [navController release];
    

    3 ..您所包含的代码部分位于何处?就像,你按一个按钮,视图被解雇或什么?