我的方法是NSString *
。如果它存在,我想打电话给它,如果没有,什么都不做。
SEL eventSelector = NSSelectorFromString(eventSelectorStr);
if ([delegate respondsToSelector:eventSelector]) {
[delegate performSelector:eventSelector];
[delegate adapterDidFinishAdRequest:self];
}
else {
// Does not implement selector
}
此代码不起作用,因为NSSelectorFromString
会将字符串注册为选择器,因此respondsToSelector:eventSelector
会导致崩溃,因为选择器实际上是无效的。
答案 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
的 情况。