2

内部的には、非 nil を返すかrespondsToSelectorどうかを調べるだけではありませんか?class_getInstanceMethod

RespondsToSelector は本質的に class_getInstanceMethod のラッパーですか? そのようです:

- (BOOL)respondsToSelector:(SEL)sel {
  return class_getInstanceMethod(self, sel) != nil;
}
4

2 に答える 2

4

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;
}
于 2013-04-15T19:35:38.730 に答える
1

-respondsToSelector:BOOL基本的に、 が値を返すかどうかを示す値class_getInstanceMethod()を返します。それはあなたの質問に答えていますか?

-respondsToSelector:のバリアントの 1 つと-performSelector:*組み合わせると、従来の Objective-C コードではより慣用的です。ランタイムへの直接呼び出しを見る (または必要とする) ことはめったにありません。

編集: 実際の実装は の呼び出しに基づいている可能性がclass_respondsToSelector()ありますが、そのランタイム メソッドの実装はコード スニペットと根本的に変わらないと思います。

于 2013-04-10T18:39:27.037 に答える