[英]Why do class_respondsToSelector and respondsToSelector behave different when sent to Class?
I have spent quite some time trying to figure out how class_respondsToSelector
and respondsToSelector
can give different results. 我花了很长时间试图弄清楚class_respondsToSelector
和respondsToSelector
如何给出不同的结果。 Consider the following class: 考虑以下课程:
@interface Dummy : NSObject
- (void)test;
@end
@implementation Dummy
- (void)test {}
@end
My scenario is that I try to determine if a class responds to a certain class method. 我的情况是我尝试确定一个类是否响应某个类方法。 This piece reproduces the problem: 这件作品再现了这个问题:
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");
If I remove the declaration and implementation of -test
, the output of the above is NO and NO as expected. 如果我删除-test
的声明和实现,上面的输出是NO和NO,如预期的那样。 However, running it as it reads above (including -test
), the output produced is the following: 但是,在上面读取它(包括-test
)时运行它,产生的输出如下:
class_respondsToSelector: YES class_respondsToSelector:是的
respondsToSelector: NO respondsToSelector:没有
The documentation says nothing about whether respondsToSelector
works for instances only, just that it indicates whether the receiver implements... , hence I am unable to determine whether this is correct behavior or not. 文档没有说明respondsToSelector
是否仅适用于实例,只是它指示接收器是否实现... ,因此我无法确定这是否是正确的行为。 Am I missing something? 我错过了什么吗?
Update 更新
Graham Lee provided this link to a great discussion on the problem . Graham Lee提供了这个链接, 对这个问题进行了很好的讨论 。
The question asked by class_respondsToSelector()
is "Do instances of this class respond to this selector?" class_respondsToSelector()
提出的问题是“此类的实例是否响应此选择器?”
The question asked by -[NSObject respondsToSelector:]
is "Does this particular instance (which is the "reciever") respond to this selector?" 问题-[NSObject respondsToSelector:]
是“这个特定实例(它是”接收者“)是否响应这个选择器?”
You're sending respondsToSelector:
to a class object, which is itself an instance of its metaclass, and asking about that particular object. 您将respondsToSelector:
发送到类对象,该类对象本身就是其元类的实例,并询问该特定对象。
To see the same results as class_respondsToSelector()
, either use +[NSObject instancesRespondToSelector:]
or get an instance of the class. 要查看与class_respondsToSelector()
相同的结果,请使用+[NSObject instancesRespondToSelector:]
或获取类的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.