Реальная реализация, прямо из NSObject.m как таковой:
- (BOOL)respondsToSelector:(SEL)aSelector {
PF_HELLO("")
return class_respondsToSelector(isa, aSelector);
}
Теперь, я понятия не имею, почему это PF_HELLO("")
есть, но, как вы можете видеть, это буквально расспрашивает класса в RUNTIME «Эй, у вас есть метод для этого isa [instance], называемого aSelector?»
И в Objective-C методы класса также относятся к экземплярам, но, однако, принимают более низкий приоритет (метод экземпляра с тем же именем, что и метод класса, вызывается перед методом класса).
Другой аспект динамической типизации Objective-C является то, что id
тип фактически объявлен следующим образом:
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Таким образом, ваш экземпляр объекта, на самом деле, указатель класса. Это означает, что ваши сообщения -ответчикиToSelector также отправляются в класс типа экземпляра. В вашем случае это означает, что -ответчикToSelector отправляется в 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];
1. Короткий ответ заключается в том, что, когда он сводится к нему, все они являются селекционерами. 2. Квадрат (верхний регистр) уже является классом, метод 'class' буквально возвращает один и тот же объект. – CodaFi
Q2: «Квадрат» оценивает мета-класс Square, который представляет собой объект, представляющий класс Square. Это экземпляр объекта, поэтому вы можете сообщить об этом. Отправка '+ class' в объект метакласса возвращает себя. – nielsbot
На самом деле, мой выше комментарий отвечает на ваши вопросы :) – nielsbot