2012-06-21 23 views
4

我收到一段时间无法识别的选择器发送到实例异常。当我得到这个我想只是跳过它,我的应用程序应该工作。如何捕获发送给实例异常的无法识别的选择器?

但是我不知道如何捕捉。由于这并不容忍:

@property(nonatomic,retain) UIButton *button; 
    @try{ 

     if(button.currentBackgroundImage == nil){//rises exception 
    } 
    }@catch(NSException *e){ 
} 

我该如何处理?

谢谢。

回答

5

我使用和经常看到的技术是:不是捕捉异常,检查对象响应选择:

if(![button respondsToSelector:@selector(currentBackgroundImage)] || button.currentBackgroundImage == nil) { 
    // do your thing here... 
} 
+2

是的,这是正确的。你想避免例外,只要你可能可以^^。 – borrrden

+0

好了一段时间后仍然得到: - [__ NSCFType setBackgroundImage:forState:]:无法识别的选择器发送到实例。也许与按钮属性我应该的东西。有了这个属性,我保存按钮实例,当我按下其他按钮时,我会删除先前按下的按钮背景 – Streetboy

+0

我打开NSZombie,发现: - [UIButton setBackgroundImage:forState:]:发送到释放实例的消息。当我将背景设置为零时,我的按钮是否被释放了吗? – Streetboy

3

如果您收到此异常,则意味着存在一个设计缺陷,您的代码中存在一个错误。通过忽略异常来修补它并不是正确的做法。试着确定你为什么要把错误的信息发送给错误的对象。您的代码将变得更加健壮和可维护。

另外,有时候当对象最初是正确的类型时,你会得到这个异常,但在被释放的过程中已经到了一半。小心!

如果您仍想绕过异常,请阅读Apple的文档,其中介绍了在运行时将消息绑定到方法实现的多步骤过程。至少有两个地方可以通过覆盖NSObject的默认行为来捕获它。

相关问题