【问题标题】:Why do class_respondsToSelector and respondsToSelector behave different when sent to Class?为什么类 respondsToSelector 和 respondsToSelector 在发送到 Class 时表现不同?
【发布时间】:2013-05-21 19:40:00
【问题描述】:

我花了很长时间试图弄清楚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:否

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

更新

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2013-08-17
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多