4

我花了很长时间试图弄清楚如何class_respondsToSelector以及respondsToSelector可以给出不同的结果。考虑以下类:

@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仅适用于实例,只是表明接收器是否实现...,因此我无法确定这是否是正确的行为。我错过了什么吗?

更新

Graham Lee 提供了这个链接,可以很好地讨论这个问题

4

1 回答 1

8

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

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

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

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

于 2013-05-21T19:49:46.967 回答