Если вы посмотрите на Objective-C Runtime Reference , вы увидите, что есть несколько функций, которые позволяют вам извлекать и проверять содержимое так называемой Protocol
структуры.
Эти структуры разрешают доступ к тому, что содержит Protocol
объект, и имена его свойств должны выводить, какова их основная цель.
Ниже перечислены некоторые элементы, которые Protocol
содержат:
- Список
objc_method_description
структур.
- Список
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));