在内部,除了了解class_getInstanceMethod是否返回非nil之外,respondsToSelector还能做更多的事情吗?
respondsToSelector本质上是class_getInstanceMethod的包装器吗?如下所示:
- (BOOL)respondsToSelector:(SEL)sel {
return class_getInstanceMethod(self, sel) != nil;
}发布于 2013-04-16 03:35:39
在苹果的开源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-11 02:39:27
-respondsToSelector:返回一个BOOL,本质上表明class_getInstanceMethod()是否会返回值。这回答了你的问题吗?
在传统的Objective-C代码中,与-performSelector:*的一种变体搭配使用的-respondsToSelector:更加惯用;很少看到(或需要)对运行时的直接调用。
编辑:实际的实现很可能基于调用class_respondsToSelector(),但我希望该运行时方法的实现与您的代码片段没有本质上的不同。
https://stackoverflow.com/questions/15933762
复制相似问题