2012-01-09 5 views
3

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

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

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

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

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

ответ

3

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

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

Некоторые из членов, которые содержат Protocol следующим образом:

  1. Перечень objc_method_description структур.
  2. Список objc_property_t structs.

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

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

Моя идея о том, как они на самом деле реализуются в том, что компилятор превращает эту так называемых @protocol декларации Into структур 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

'conformsToProtocol:' не все равно, что в протоколе. Он просто проверяет, находится ли протокол в списке протоколов класса или любого его суперкласса (per 'class_copyProtocolList()') – user102008

0

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