为什么class_respondsToSelector和respondsToSelector在发送给Class时表现不同?

时间:2013-05-21 19:40:00

标签: objective-c selector objective-c-runtime

我花了很多时间试图弄清楚class_respondsToSelectorrespondsToSelector如何能够给出不同的结果。考虑以下课程:

@interface Dummy : NSObject
- (void)test;
@end

@implementation Dummy
- (void)test {}
@end

我的情况是我尝试确定一个类是否响应某个类方法。这件作品再现了这个问题:

Class class = [Dummy class];
if (class_respondsToSelector(class, @selector(test)))
    NSLog(@"class_respondsToSelector: YES");
else
    NSLog(@"class_respondsToSelector: NO");
if ([class respondsToSelector:@selector(test)])
    NSLog(@"respondsToSelector: YES");
else
    NSLog(@"respondsToSelector: NO");

如果删除-test的声明和实现,则上述输出为NO和NO,如预期的那样。但是,如上所述运行它(包括-test),产生的输出如下:

  

class_respondsToSelector:是

     

respondsToSelector:NO

文档没有说明respondsToSelector是否仅适用于实例,只是它指示接收器是否实现... ,因此我无法确定这是否是正确的行为或不。我错过了什么吗?

更新

Graham Lee将此链接提供给great discussion on the problem

1 个答案:

答案 0 :(得分:8)

class_respondsToSelector()提出的问题是“此类的实例是否响应此选择器?”

-[NSObject respondsToSelector:]提出的问题是“此特定实例(即”接收者“)是否会响应此选择器?”

您正在向类对象发送respondsToSelector:,该对象本身就是其元类的一个实例,并询问该特定对象。

要查看与class_respondsToSelector()相同的结果,请使用+[NSObject instancesRespondToSelector:]或获取该类的实例。