[英]respondsToSelector and class_getInstanceMethod
Internally, does respondsToSelector
do more than finding out if class_getInstanceMethod
return non-nil? 在内部,不respondsToSelector
做多找出若再class_getInstanceMethod
返回非零?
Is respondsToSelector essentially a wrapper of class_getInstanceMethod? responsToSelector本质上是class_getInstanceMethod的包装吗? Like so: 像这样:
- (BOOL)respondsToSelector:(SEL)sel {
return class_getInstanceMethod(self, sel) != nil;
}
In Apple's open-source NSObject implementation , respondsToSelector:
is on line 1472 and looks like this: 在Apple的开源NSObject实现中 , respondsToSelector:
在第1472行,如下所示:
- (BOOL)respondsToSelector:(SEL)sel {
if (!sel) return NO;
return class_respondsToSelector([self class], sel);
}
class_respondsToSelector()
in turn is on line 729 of objc-class.mm : 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:
returns a BOOL
indicating, essentially, whether class_getInstanceMethod()
would return a value. -respondsToSelector:
返回一个BOOL
,从本质上指示class_getInstanceMethod()
是否会返回值。 Does that answer your question? 这是否回答你的问题?
-respondsToSelector:
paired with one of the variants of -performSelector:*
is more idiomatic in conventional Objective-C code; -respondsToSelector:
用的变体的一个配对的-performSelector:*
是在常规Objective-C代码更地道; it's rare to see (or to need) direct calls to the runtime. 很少看到(或需要)直接调用运行时。
Edit : the actual implementation is likely based on calling class_respondsToSelector()
, but I expect that the implementation of that runtime method is not fundamentally different than your code snippet. 编辑 :实际的实现可能是基于调用class_respondsToSelector()
,但是我希望该运行时方法的实现与您的代码段没有本质上的不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.