respondsToSelector和class_getInstanceMethod

时间:2013-04-10 18:37:40

标签: objective-c cocoa-touch objective-c-runtime

在内部,respondsToSelector做的不仅仅是找出class_getInstanceMethod是否返回非零?

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

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

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

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