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