まず IMP です。メソッド実装の先頭部分を指すポインタです。
IMP はメソッドを実装する関数の先頭部分を指すポインタです。この関数は現在の CPU アーキテクテャのために実装された標準 C の呼出規約(calling convention)を使います。最初の引数は self(クラスの特定の具体的なインスタンスのためのメモリ、クラスメソッドのためのメモリ、メタクラスを指すポインタのためのメモリ)へのポインタです。2番目の引数はメソッドセレクタです。メソッドの引数は以下の通り。
SEL
そして SEL です。セレクタを表現する構造体で Opaque Type です。
メソッドのセレクタはランタイムでメソッドの名前表現として使われます。メソッドのセレクタは Objective-C に登録(またはマッピング)されている C 文字列です。コンパイラによって生成されたセレクタは、クラスがロードされるとき、自動的にランタイムによってマッピングされます。
実行時に新しいセレクタを追加し、sel_registerName 関数を使って存在しているセレクタを取得できます。
セレクタを使うとき、sel_registerName が返す値か、Objective-C のコンパイラディレクティブ @selector() を使わなければなりません。単純に C 文字列を SEL にキャストすることはできません。
Method
Method はクラスで定義されているメソッドを表現する構造体で Opaque Type です。リファレンスには
としかありませんが runtime.h にはさらに
struct objc_method { SEL method_name OBJC2_UNAVAILABLE; char *method_types OBJC2_UNAVAILABLE; IMP method_imp OBJC2_UNAVAILABLE; }とあります。OBJC2_UNAVAILABLE は Objective-C 2.0 では無効ということのようで、Objective-C 2.0 の環境ではこの構造体に直接アクセスはできません。Method 構造体にのデータにアクセスするには専用(method_*)のランタイム関数を使ってやればよしです。
めも
http://opensource.apple.com/
0 件のコメント:
コメントを投稿