2014-01-20 2 views
4

Метод methodSignatureForSelector: - метод экземпляра -, а не первый класс +. Так почему мое приложение не ломается, когда я это сделать:Почему [self class] отвечает на методSignatureForSelector :?

return [[self class] methodSignatureForSelector:@selector(selector)]; 

Он также работает с methodForSelector: методом. Зачем? Оказывается, что class может ответить на сообщение +, например alloc и за сообщениями -. Может ли кто-нибудь пролить свет на этот вопрос?

+4

Потому что [классы Objective-C также являются объектами] (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/DefiningClasses/DefiningClasses.html#//apple_ref/doc/uid/ TP40011210-CH3-SW18) – Kreiri

ответ

3

Класс класса объекта называется meta class. В большинстве случаев метакласс и обычный класс имеют один и тот же корневой класс, NSObject. Вот почему каждый класс реагирует на методы экземпляра NSObject.

+0

Но как насчет 'методForSelector', где метод не является методом класса' NSObject'? Это было также в вопросе ОП. – zaph

+0

@Zaph Как я уже сказал, класс root и класс meta root всегда идентичны. Это означает, что для корневого класса (NSObject в этом случае достаточно) реализовать ** методы экземпляра **, чтобы сделать их доступными как ** методы класса ** для всех производных классов. –

+0

Правильно, 'methodForSelector' возвращает' IMP' только. – zaph