gpt4 book ai didi

ios - 警报 View :didDismissWithButtonIndex: message sent to deallocated instance

转载 作者:行者123 更新时间:2023-11-29 04:19:31 25 4
gpt4 key购买 nike

此问题仅发生在 iOS4.3 上。我使用的是 ARC,我的 Base SDK 是 iOS6。

-viewDidAppear在我的 View Controller 中,我检查这是否是应用程序第一次启动,如果是,则创建并显示 UIAlertView。我将该 UIAlertView 分配给 strong View Controller 上的属性并将 self 设置为 UIAlertView 委托(delegate)。

self.uiAlertView = [[UIAlertView alloc] initWithTitle:@"Welcome!"
message:messageString
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:@"View Tutorial Videos", @"Email Support", nil];

当我点击其中一个按钮时,应用程序崩溃并提示 -alertView:didDismissWithButtonIndex:被发送到已解除分配的实例。委托(delegate)是显示 UIAlertView 的 View Controller 。

在应用程序的所有后续启动中,当 UIAlertView 未显示时,没有问题。 View Controller 绝对没有被释放。

如果我显示 UIAlertView 但将委托(delegate)设置为 nil,那么就没有问题,应用程序会继续工作,所以显然 View Controller 尚未被释放,因为我可以继续使用它。

发生了什么事?这只会导致iOS4.3出现问题。

编辑:根据评论中的建议,我在不同的地方添加了更多日志消息。

我发现 View Controller 正在被释放,但前提是该 View Controller 显示 UIAlertView。究竟是什么会导致 View Controller 仅仅因为将自己设置为 UIAlertView 的委托(delegate)然后显示它而被释放?

我的应用程序委托(delegate)有一个 strong对 View Controller 的引用,因此我绝对没有理由看到 View Controller 被释放。


编辑2:我发现在启动期间我的主视图 Controller 被实例化两次。第一个是创建 UIAlertView 的那个,并且那个正在被释放。第二个是我后来能够与之交互的那个,这让我认为 View Controller 仍然存在并且可以操作。

但是,我无法弄清楚我的 View Controller 将在何处或为何被创建两次。我没有任何 View Controller 的分配/初始化语句。它仅存在于MainWindow_iPhone.xib 中。

第一次在我的 View Controller 上调用 viewDidLoad 时,上面的堆栈帧是 [UIViewController view]。第二次在 View Controller 的第二个实例上调用 viewDidLoad 时,上面的堆栈帧是 [UINib instantiateWithOwner:options:]


编辑3:我已经“解决”了这个问题,但我不明白为什么会发生这种情况。也许你可以帮助我理解。

在我的 MainWindow_iPhone.xib 中,我创建了 Root View Controller 并将其分配给我的应用程序委托(delegate)上的 IBOutlet。相反,我从 xib 中删除了 View Controller ,并在 -application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中的代码中创建了它。 ...然后问题就消失了。

为什么 View Controller 在 xib 中会被创建两次?

最佳答案

我以前也遇到过这个问题。在alertView: clickedButtonAtIndex: 之后调用alertView:didDismissWithButtonIndex:。您很可能通过执行类似 [self.navigationController popViewControllerAnimated:YES] 的操作来释放alertView:clickedButtonAtIndex 中的 View Controller 。

UIAlertView委托(delegate)分配非弱引用。当 delegate 被释放时,它不会自动设置为 nil。这就是您的代码崩溃的原因。

关于ios - 警报 View :didDismissWithButtonIndex: message sent to deallocated instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com