NSObject.m から直接抽出した実際の実装は次のとおりです。
- (BOOL)respondsToSelector:(SEL)aSelector {
PF_HELLO("")
return class_respondsToSelector( isa, aSelector );
}
なぜPF_HELLO("")
そこにあるのかはわかりませんが、ご覧のとおり、文字通り、ランタイムでクラスに「ねえ、この isa [インスタンス] の aSelector と呼ばれるメソッドはありますか?」と尋ねています。
また、Objective-C では、クラス メソッドもインスタンスに属しますが、優先順位は低くなります (クラス メソッドと同じ名前のインスタンス メソッドは、クラス メソッドの前に呼び出されます)。
Objective-C の動的型付けのもう 1 つの側面は、id
型が実際には次のように宣言されていることです。
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
したがって、インスタンス オブジェクトは実際にはクラス ポインターです。これは、 -respondsToSelector メッセージがインスタンス タイプのクラスにも送信されることを意味します。あなたの場合、それは -respondsToSelector が最初に objc_class に行くことを意味します。
テストケース(libFoundationから直接)では、私の答えは次のように要約されます。
Test *tst = [Test new];
fail_unless([tst respondsToSelector:@selector(testInstanceMethod)], "-[Test respondsToSelector:] returned NO for a valid instance method (testInstanceMethod).");
fail_if([tst respondsToSelector:@selector(testClassMethod)], "-[Test respondsToSelector:] returned YES for a class method (testInstanceMethod).");
fail_unless([Test respondsToSelector:@selector(testClassMethod)], "+[Test respondsToSelector:] returned NO for a valid class method (testClassMethod).");
fail_if([Test respondsToSelector:@selector(testInstanceMethod)], "+[Test respondsToSelector:] returned YES for an instance method (testInstanceMethod).");
fail_unless([tst respondsToSelector:@selector(init)], "-[Test respondsToSelector:] returned NO for an inherited instance method (-[NSObject init].");
fail_unless([Test respondsToSelector:@selector(alloc)], "+[Test respondsToSelector:] returned NO for an inherited class method (+[NSObject alloc]).");
[tst release];