2012-01-09 12 views
3

私が知る限り、Objective-CのクラスはCの構造体の観点から格納されています。 プロトコルはどのように実装されていますか?プロトコルはどのように内部実装されていますか?

私はこれを簡単に理解したいと思います。

[NSObject conformsToProtocol:]はクラスがプロトコルに準拠しているか否かをチェックするのですか?

プロトコルのセレクタを示すプロトコルのテーブルまたはデータ構造はありますか?

注:用語「プロトコル」ここでは、Objective Cの構成物ではないネットワークプロトコルを参照するために使用されます。

答えて

3

Objective-C Runtime Referenceを見ると、&の内容を調べて、いわゆるProtocol構造体の内容を調べることができます。

これらの構造体は、その基礎となる目的が何であるかを推測するべきかProtocolオブジェクトが含まれており、そのプロパティ名にアクセスすることができます。

  1. objc_method_description構造体のリストを次のように

    Protocolが含まれているメンバーの一部があります。

  2. 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)); 
+0

'conformsToProtocol::'プロトコルに何があるか気にしません

そのため、あなたはこのような何かを行うことができます。プロトコルがクラスのスーパークラスのリスト(class_copyProtocolList()ごと)にあるかどうかをチェックするだけです – user102008

0

プロトコルは、特定のメソッドが呼び出されることを指定することによって動作します。特定のメソッドが実装されているかどうかを確認するためにオブジェクト 'respondsToSelector'が必要かどうかを尋ね、メソッドを呼び出すことによって呼び出します。

関連する問題