2

在内部,respondsToSelector除了找出是否class_getInstanceMethod返回非零之外,还做更多的事情吗?

respondsToSelector 本质上是 class_getInstanceMethod 的包装器吗?像这样:

- (BOOL)respondsToSelector:(SEL)sel {
  return class_getInstanceMethod(self, sel) != nil;
}
4

2 回答 2

4

在 Apple 的开源NSObject implementation中,respondsToSelector:位于第 1472 行,如下所示:

- (BOOL)respondsToSelector:(SEL)sel { 
    if (!sel) return NO; 
    return class_respondsToSelector([self class], sel); 
}

class_respondsToSelector()依次在objc-class.mm的第 729 行:

BOOL class_respondsToSelector(Class cls, SEL sel)
{
    IMP imp;

    if (!sel  ||  !cls) return NO;

    // Avoids +initialize because it historically did so.
    // We're not returning a callable IMP anyway.
    imp = lookUpMethod(cls, sel, NO/*initialize*/, YES/*cache*/, nil);
    return (imp != (IMP)_objc_msgForward_internal) ? YES : NO;
}
于 2013-04-15T19:35:38.730 回答
1

-respondsToSelector:返回一个BOOL指示,本质上,是否class_getInstanceMethod()会返回一个值。这是否回答你的问题?

-respondsToSelector:在传统的 Objective-C 代码中,与 的变体之一配对-performSelector:*更惯用;很少看到(或需要)直接调用运行时。

编辑:实际实现可能基于调用class_respondsToSelector(),但我希望该运行时方法的实现与您的代码片段没有根本不同。

于 2013-04-10T18:39:27.037 回答