ios – 在什么情况下instanceRespondToSelector:返回true,但performSelector:抛出异常

我的代码分布在一个库中,如下所示:

if ([[NSString class] instancesRespondToSelector: @selector(JSONValue)]) {
  NSString *jsonString = [[[NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding] autorelease];
  dict = [jsonString performSelector: @selector(JSONValue)];
}

由于某些原因,当调用performSelector:方法时,将发送到实例异常的无法识别的选择器 – [__ NSCFString JSONValue].这是分布在我写的库中的代码,但是我自己无法重现或调试它.而是第三方报告此问题.在什么条件下可以使用performSelector来实例调用方法:抛出异常?

编辑
有一种情况可以解释为什么会发生这种情况,但没有任何意义.如果开发者要做这样的事情:

@implementation NSString (OurHappyCategory)

+ (BOOL)instancesRespondToSelector:(SEL)aSelector
{
  return YES;
}

@end

这将解释为什么代码正在执行,但它当然是一件非常糟糕的事情.有没有办法可以发生这个问题呢?

NSString基本上是一个class cluster,并带来各种各样的并发症…您实际上需要询问实例是否响应选择器.

NSString *jsonString = [[[NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding] autorelease];
if ([jsonString respondsToSelector: @selector(JSONValue)]) {
  dict = [jsonString performSelector: @selector(JSONValue)];
}

但是您的问题可能与编译或链接扩展名有关…如果类添加到库中,则需要在-ObjC链接器标记中进行排列.

编辑:
我一直在努力重现这个问题,我无法…
你有没有更多的信息.​​.例如,失败只发生在模拟器上,或只是在设备上,iOS 4.x,GNU链接器与LLDB的链接器,ABI /运行时差异?

http://stackoverflow.com/questions/15895970/under-what-conditions-might-instancesrespondtoselector-return-true-but-perform

转载注明原文:ios – 在什么情况下instanceRespondToSelector:返回true,但performSelector:抛出异常