ARC 和 UIAlertView:发送到实例的无法识别的选择器

Posted

技术标签:

【中文标题】ARC 和 UIAlertView:发送到实例的无法识别的选择器【英文标题】:ARC and UIAlertView: unrecognized selector sent to instance 【发布时间】:2012-01-20 19:43:23 【问题描述】:

这是我如何显示 UIAlertView 和委托 clickedButtonAtIndex -

UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle: @"title"
                               message: @"message"
                              delegate: self
                     cancelButtonTitle: @"Cancel"
                     otherButtonTitles: @"Continue", nil];

    [alert show];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    //something

这段代码在没有 ARC 的情况下也能完美运行。但是使用 ARC 它会引发此错误- 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFType alertView:clickedButtonAtIndex:]: unrecognized selector sent to instance 0x859d790”

关于代理为何抛出此错误的任何想法?

【问题讨论】:

委托本身正在被释放。您是如何创建和管理该对象的? @FirozeLafeer - 调用这段代码的对象,即 self 被 ARC 释放。我把它变成了一个属性,现在它似乎可以工作了。谢谢:) 【参考方案1】:

您的委托已被解除分配。仔细检查您的代码,以确保显示警报并将自己设置为委托的对象以某种方式被保留(即:您的应用中的某些内容对其具有强引用)。

【讨论】:

这确实是我的问题,在这篇文章之后我意识到这是因为我在情节提要中复制了一个按钮,该按钮仍然附加了一个方法,该方法对 viewController 进行了释放。因此,我的其他方法(被调用并正确执行)无法执行 clickedButtonAtIndex 中的任务。希望这对某人有所帮助,感谢您的解决方案! 另外,在 CocoaPods 中搜索 UIAlertView,您会发现许多基于块的附加功能,它们将简化 UIAlertView 的使用并消除在视图控制器中使用 UIAlertViewDelegate 的需要。【参考方案2】:

如果您忘记最后一个 otherButtonTitles 参数后的 nil,也会发生类似情况:

delegate: self cancelButtonTitle: @"No" otherButtonTitles: @"Yes",nil]; // don't forget the nil at the end here! (or it will crash first run)

有趣的是,它仅在您第一次运行应用程序时崩溃。之后,它运行得很好。

【讨论】:

以上是关于ARC 和 UIAlertView:发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

[CustomViewController respondsToSelector:]:消息发送到释放的实例

[UINavigationController 保留]:发送到已释放实例的消息

消息发送到解除分配的实例...在@synthesize 期间发送?

alertView:didDismissWithButtonIndex: 消息发送到解除分配的实例

UIAlertView 设置和禁用飞行模式

arc音频回传功能需要投影支持吗