在内部,respondsToSelector
除了找出是否class_getInstanceMethod
返回非零之外,还做更多的事情吗?
respondsToSelector 本质上是 class_getInstanceMethod 的包装器吗?像这样:
- (BOOL)respondsToSelector:(SEL)sel {
return class_getInstanceMethod(self, sel) != nil;
}
在内部,respondsToSelector
除了找出是否class_getInstanceMethod
返回非零之外,还做更多的事情吗?
respondsToSelector 本质上是 class_getInstanceMethod 的包装器吗?像这样:
- (BOOL)respondsToSelector:(SEL)sel {
return class_getInstanceMethod(self, sel) != nil;
}
在 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;
}
-respondsToSelector:
返回一个BOOL
指示,本质上,是否class_getInstanceMethod()
会返回一个值。这是否回答你的问题?
-respondsToSelector:
在传统的 Objective-C 代码中,与 的变体之一配对-performSelector:*
更惯用;很少看到(或需要)直接调用运行时。
编辑:实际实现可能基于调用class_respondsToSelector()
,但我希望该运行时方法的实现与您的代码片段没有根本不同。