简体   繁体   English

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

[英]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_respondsToSelectorrespondsToSelector如何给出不同的结果。 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.

相关问题 从Objective-C代码为Swift类方法调用class_respondsToSelector - calling class_respondsToSelector for a Swift class method from Objective-C code 检查类responsesToSelector是否不起作用 - Checking if Class respondsToSelector not working 用于超级类调用的responsToSelector - respondsToSelector for super class invocation responsesToSelector和class_getInstanceMethod - respondsToSelector and class_getInstanceMethod 类方法等效于-respondsToSelector: - Class method equivalent of -respondsToSelector: 为什么可以在类名或类对象上使用-respondsToSelector:实例方法? - Why can -respondsToSelector: instance method be used on class name or class object? 如果类通过respondsToSelector响应选择器,则检查动态: - check dynamic if a class responds to a selector by respondsToSelector: 何时快速使用responsesToSelector? - When to use respondsToSelector in swift? 尝试访问objectArray时出现“-[CFString responsesToSelector:]:已发送消息到已释放实例” - “-[CFString respondsToSelector:]: message sent to deallocated instance” when trying to access objectArray Objective-C:检查类类型,最好使用isKindOfClass或respondsToSelector? - Objective-C: Checking class type, better to use isKindOfClass, or respondsToSelector?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM