内部的には、非 nil を返すかrespondsToSelector
どうかを調べるだけではありませんか?class_getInstanceMethod
RespondsToSelector は本質的に class_getInstanceMethod のラッパーですか? そのようです:
- (BOOL)respondsToSelector:(SEL)sel {
return class_getInstanceMethod(self, sel) != nil;
}
内部的には、非 nil を返すかrespondsToSelector
どうかを調べるだけではありませんか?class_getInstanceMethod
RespondsToSelector は本質的に class_getInstanceMethod のラッパーですか? そのようです:
- (BOOL)respondsToSelector:(SEL)sel {
return class_getInstanceMethod(self, sel) != nil;
}
Apple のオープンソースNSObject 実装で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:
のバリアントの 1 つと-performSelector:*
組み合わせると、従来の Objective-C コードではより慣用的です。ランタイムへの直接呼び出しを見る (または必要とする) ことはめったにありません。
編集: 実際の実装は の呼び出しに基づいている可能性がclass_respondsToSelector()
ありますが、そのランタイム メソッドの実装はコード スニペットと根本的に変わらないと思います。