Реальная реализация, прямо из NSObject.m, такова:
- (BOOL)respondsToSelector:(SEL)aSelector {
PF_HELLO("")
return class_respondsToSelector( isa, aSelector );
}
Теперь я понятия не имею, почему это PF_HELLO("")
, но, как вы можете видеть, это буквально спрашиваетКЛАСС В РАБОТЕ "Эй, у вас есть метод для этого isa [instance], называемый aSelector?"
И в Objective-C методы класса ТАКЖЕ принадлежат экземплярам, но, тем не менее, имеют меньший приоритет (метод экземпляра с тем же именем, что и метод класса, вызывается перед методом класса).
Другим аспектом динамической типизации Objective-C является то, что тип id
фактически объявлен следующим образом:
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Таким образом, ваш экземплярный объект на самом деле является указателем класса.Это означает, что ваши сообщения -respondsToSelector отправляются также в класс типа экземпляра.В вашем случае это означает, что -respondsToSelector отправляется в objc_class FIRST.
Теперь в тестовом примере (прямо из 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];