0

好的,所以我刚刚开始 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]: message sent to deallocated instance 0x6e6a570 lldb

这里发生了什么?为什么它试图再次向 appViewController 发送消息?[av show] 后没有代码

注意:我正在使用 ARC

4

2 回答 2

1

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

这似乎您的根视图控制器在某个时候被释放,并且当响应者链被遍历时,产生的悬空指针被访问。

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

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

如果在您期望它发生之前调用了它(对于根视图控制器可能根本不会),您需要找出发生这种情况的原因。您可能在某处缺少强有力的参考。检查您的应用程序委托并确认您对窗口有强引用,并且您将控制器设置为根视图控制器(前提是您没有使用情节提要)。

Zombies 工具非常适合调试此类问题。它将列出有问题的对象的所有保留和释放。这是一个简短的介绍

于 2012-08-21T17:18:42.230 回答
0

有几件事。

  1. 您正在混合 presentViewController 和 presentModalViewController。如果您是 iOS 新手,您应该始终使用 presentViewController。无需习惯使用即将被弃用的方法(请参阅此问题的回答PresentModalViewController 和 presentViewController 之间的区别?

  2. 一般来说,除非绝对必要,否则不应自动释放。因为当使用 presentViewController(和 presentModalViewController)呈现控制器时,它会被保留,您可以在之后轻松释放。我会这样重组:

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

3..您包含的代码部分位于何处?就像,你按下一个按钮,视图被关闭还是什么?

于 2012-08-21T17:17:44.973 回答