Как протоколы реализованы внутри? - PullRequest
3 голосов
/ 09 января 2012

Насколько я знаю, классы в Objective-C хранятся в терминах структур C.Как реализуются протоколы?

Я хотел бы понять это в простых терминах.

Что делает [NSObject conformsToProtocol:], чтобы проверить, соответствует ли класс протоколу или нет?

Существует ли таблица или структура данных для протокола, который сообщает, какие селекторы присутствуют в протоколе?

ПРИМЕЧАНИЕ. Термин «протокол» здесь используется для обозначения конструкции Objective C, а не сетевого протокола.

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Если вы посмотрите на Objective-C Runtime Reference , вы увидите, что есть несколько функций, которые позволяют вам извлекать и проверять содержимое так называемой Protocol структуры.

Эти структуры разрешают доступ к тому, что содержит Protocol объект, и имена его свойств должны выводить, какова их основная цель.

Ниже перечислены некоторые элементы, которые Protocol содержат:

  1. Список objc_method_description структур.
  2. Список objc_property_t структур.

И, конечно, метод с именем protocol_getName, который даст вам имя самого протокола.

Я думаю, что этого должно быть достаточно, чтобы сделать вывод, как эти протоколы реализуются компилятором Objective-C + время выполнения.

Моя идея о том, как они на самом деле реализованы, заключается в том, что компилятор превращает эти так называемые @protocol объявления в структуры C во время компиляции, а методы Objective-C, такие как conformsToProtocol:, просто выполняют сравнения элементов переданной структуры, сгенерированной языковой конструкцией @protocol.

Следовательно, вы можете сделать что-то вроде этого:

@protocol BlahProtocol <NSObject>

-(void)blahMethod;
@property (nonatomic, strong) id blahProperty;

@end

//...
Protocol *blah = objc_getProtocol("BlahProtocol");
struct objc_method_description blahMethodDescription = protocol_getMethodDescription(blah, @selector(blahMethod), NO, YES);

NSLog(@"%s %s", blahMethodDescription.name, blahMethodDescription.types);

objc_property_t blahProperty = protocol_getProperty(blah, "blahProperty", NO, YES);

NSLog(@"%s", property_getAttributes(blahProperty));
0 голосов
/ 09 января 2012
Протоколы

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...