如何在给定NSString时找出Obj-C中是否存在方法

时间:2010-05-03 21:00:09

标签: iphone objective-c nsstring selector

我的方法是NSString *。如果它存在,我想打电话给它,如果没有,什么都不做。

SEL eventSelector = NSSelectorFromString(eventSelectorStr);
if ([delegate respondsToSelector:eventSelector]) {
    [delegate performSelector:eventSelector];
    [delegate adapterDidFinishAdRequest:self];
}
else {
    // Does not implement selector
}

此代码不起作用,因为NSSelectorFromString会将字符串注册为选择器,因此respondsToSelector:eventSelector会导致崩溃,因为选择器实际上是无效的。

4 个答案:

答案 0 :(得分:5)

为什么你说这不起作用?这是实现调用可选委托方法的最常用方法。我从来没有遇到过这种结构无法解决的问题。

答案 1 :(得分:1)

让我们澄清一些困惑。

NSSelectorFromString()将从字符串生成一个有效的选择器,并且不会崩溃。 respondsToSelector:将有效地确定委托是否实现该方法,而不会崩溃。确实,如果你调用performSelector:使用一个代表没有实现的选择器,它将导致崩溃。

但是,这不是这里的情况。代码有效。如果您在此代码中遇到崩溃,我会检查错误消息,然后查看adapterDidFinishAdRequest:

答案 2 :(得分:0)

在使用之前尝试检查eventSelector != nil

答案 3 :(得分:0)

我花了一段时间才明白这一点。关键的见解是选择器引用基本上只是一个打扮的C字符串,并且不属于任何特定的类或对象。当NSSelectorFromString()文档说选择器是“已注册”时,它只意味着打扮的C字符串是“祝福”(我的术语),用作Objective-C运行时中的选择器。

以下是Apple文档中NSSelectorFromString()的返回值部分:

  

返回值

     

aSelectorName 命名的选择器。   如果 aSelectorName nil,或者不能   转换为UTF-8(这应该是   只是由于记忆力不足),   返回(SEL)0

仔细阅读它会显示,如果您的字符串为(SEL)0或者内存不足,则只会导致nil 情况。