在内部,respondsToSelector
做的不仅仅是找出class_getInstanceMethod
是否返回非零?
respondsToSelector本质上是class_getInstanceMethod的包装器吗?像这样:
- (BOOL)respondsToSelector:(SEL)sel {
return class_getInstanceMethod(self, sel) != nil;
}
答案 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()
,但我希望该运行时方法的实现与您的代码段没有根本的不同。