|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
Objective-Cでは、メッセージは実行時までメソッド実装にバインドされません。コンパイラは、次のメッセージ式を変換します。
[receiver message] |
上記のメッセージは、メッセージ関数の呼び出しobjc_msgSendに変換されます。この関数は、メッセージに記述されたレシーバとメソッドの名前(メソッドセレクタ)を2つの主要なパラメータとして利用します。
objc_msgSend(receiver, selector) |
メッセージに渡された引数は、objc_msgSendにも渡されます。
objc_msgSend(receiver, selector, arg1, arg2, ...) |
メッセージング関数は、動的バインディングに必要なことをすべて実行します。
まず、セレクタが参照するプロシージャ(メソッド実装)を探します。同じメソッドを別々のクラスでそれぞれ実装できるため、メッセージング関数が探す正確なプロシージャはレシーバのクラスによって決まります。
次に、プロシージャを呼び出し、メソッドに指定された引数と一緒に、受信側オブジェクト(そのデータへのポインタ)を渡します。
最終的に、プロシージャの戻り値を自身の戻り値として渡します。
メッセージングのポイントは、コンパイラが各クラスとオブジェクトに対して構築する構造にあります。あらゆるクラス構造には、次の2つの重要な要素が含まれています。
スーパークラスへのポインタ。
クラスのディスパッチテーブル。このテーブルには、メソッドセレクタとそれらが識別するメソッドのクラス固有のアドレスを関連付けるエントリがあります。たとえば、setOrigin::メソッドのセレクタはsetOrigin::(を実装するプロシージャ)のアドレスと関連付けられ、displayメソッドのセレクタはdisplayのアドレスと関連付けられています。
新しいオブジェクトが作成されると、そのメモリが割り当てられ、そのインスタンス変数が初期化されます。オブジェクトの変数の中で最初のものはクラス構造のポインタです。このポインタはisaと呼ばれ、クラス、および継承されるすべてのクラスにアクセスする手段をオブジェクトに提供します。
注: 厳密には言語の一部ではありませんが、オブジェクトがObjective-Cランタイムシステムと連携するにはisaポインタが必要になります。オブジェクトは、構造に定義されるどのようなフィールドでもstruct objc_object(objc/objc.hで定義)と「同等」ではければなりません。しかし、独自にルートオブジェクトを作成する必要が生じることは、あったとしても非常にまれで、NSObjectまたはNSProxyを継承するオブジェクトはisa変数を自動的に持っています。
これらのクラスとオブジェクト構造の要素を、図 7-1に示します。
メッセージをオブジェクトに送信すると、メッセージング関数は、オブジェクトのisaポインタをたどってクラス構造に到達し、そこでディスパッチテーブルでメソッドセレクタを調べます。ディスパッチテーブルにセレクタが見つからない場合、objc_msgSendはポインタをたどってスーパークラスに到達し、そのディスパッチテーブルの中でセレクタを探します。失敗し続けると、objc_msgSendはNSObjectクラスに達するまでクラス階層を遡ることになります。セレクタが見つけると、この関数はテーブルに含まれているメソッドを呼び出し、受信側オブジェクトのデータ構造を渡します。
これが、実行時にメソッド実装が選択される方法です。オブジェクト指向プログラミング特有の言い回しをすれば、メソッドがメッセージへ動的にバインドされるといいます。
メッセージング処理をスピードアップするため、ランタイムシステムはセレクタの使用に伴って、セレクタと、対応するメソッドのアドレスをキャッシュします。クラスごとに個別のキャッシュがあり、そのクラスで定義されたメソッドのセレクタだけでなく、継承したメソッドのセレクタを含むこともできます。ディスパッチテーブルを検索する前に、メッセージングルーチンはまず、受信側オブジェクトのクラスのキャッシュを確認します(一度使用したメソッドは再度使用する可能性があるため)。キャッシュにメソッドセレクタがある場合、メッセージングは関数呼び出しより若干遅いだけです。キャッシュを「ウォームアップ」するのに十分な時間、プログラムが実行されると、そのプログラムが送信するほとんどすべてのメッセージは、対応するキャッシュされたメソッドが見つかります。プログラムの実行に伴い、新しいメッセージに対応するため、キャッシュは動的に成長します。
| < 前ページ次ページ > |
Last updated: 2007-10-31
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |