Objective-C Runtime Referenceを見ると、&の内容を調べて、いわゆるProtocol
構造体の内容を調べることができます。
これらの構造体は、その基礎となる目的が何であるかを推測するべきかProtocol
オブジェクトが含まれており、そのプロパティ名にアクセスすることができます。
objc_method_description
構造体のリストを次のように Protocol
が含まれているメンバーの一部があります。
objc_property_t
構造体のリストです。
もちろん、protocol_getName
と呼ばれる方法で、プロトコル自体の名前が与えられます。
私は、これは、これらのプロトコルは、Objective-Cのコンパイラ+ランタイムによって実装されている方法を自分のために推測するに十分であるべきだと思います。
実際に実装されている私の考えは、コンパイル時にコンパイラがこれらのいわゆる@protocol
宣言をC構造体に変換し、conformsToProtocol:
などのObjective-Cメソッドは渡された構造体には、@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::'プロトコルに何があるか気にしません
そのため、あなたはこのような何かを行うことができます。プロトコルがクラスのスーパークラスのリスト(class_copyProtocolList()ごと)にあるかどうかをチェックするだけです – user102008