Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC

< 前ページ次ページ >

objc_msgSend関数

Objective-Cでは、メッセージは実行時までメソッド実装にバインドされません。コンパイラは、次のメッセージ式を変換します。

[receiver message]

上記のメッセージは、メッセージ関数の呼び出しobjc_msgSendに変換されます。この関数は、メッセージに記述されたレシーバとメソッドの名前(メソッドセレクタ)を2つの主要なパラメータとして利用します。

objc_msgSend(receiver, selector)

メッセージに渡された引数は、objc_msgSendにも渡されます。

objc_msgSend(receiver, selector, arg1, arg2, ...)

メッセージング関数は、動的バインディングに必要なことをすべて実行します。

注: メッセージング関数の呼び出しは、コンパイラによって生成されます。自分が作成するコードの中で直接呼び出してはなりません。

メッセージングのポイントは、コンパイラが各クラスとオブジェクトに対して構築する構造にあります。あらゆるクラス構造には、次の2つの重要な要素が含まれています。

新しいオブジェクトが作成されると、そのメモリが割り当てられ、そのインスタンス変数が初期化されます。オブジェクトの変数の中で最初のものはクラス構造のポインタです。このポインタはisaと呼ばれ、クラス、および継承されるすべてのクラスにアクセスする手段をオブジェクトに提供します。

注: 厳密には言語の一部ではありませんが、オブジェクトがObjective-Cランタイムシステムと連携するにはisaポインタが必要になります。オブジェクトは、構造に定義されるどのようなフィールドでもstruct objc_objectobjc/objc.hで定義)と「同等」ではければなりません。しかし、独自にルートオブジェクトを作成する必要が生じることは、あったとしても非常にまれで、NSObjectまたはNSProxyを継承するオブジェクトはisa変数を自動的に持っています。

これらのクラスとオブジェクト構造の要素を、図 7-1に示します。


図 7-1  メッセージングフレームワーク

メッセージングフレームワーク

メッセージをオブジェクトに送信すると、メッセージング関数は、オブジェクトのisaポインタをたどってクラス構造に到達し、そこでディスパッチテーブルでメソッドセレクタを調べます。ディスパッチテーブルにセレクタが見つからない場合、objc_msgSendはポインタをたどってスーパークラスに到達し、そのディスパッチテーブルの中でセレクタを探します。失敗し続けると、objc_msgSendNSObjectクラスに達するまでクラス階層を遡ることになります。セレクタが見つけると、この関数はテーブルに含まれているメソッドを呼び出し、受信側オブジェクトのデータ構造を渡します。

これが、実行時にメソッド実装が選択される方法です。オブジェクト指向プログラミング特有の言い回しをすれば、メソッドがメッセージへ動的にバインドされるといいます。

メッセージング処理をスピードアップするため、ランタイムシステムはセレクタの使用に伴って、セレクタと、対応するメソッドのアドレスをキャッシュします。クラスごとに個別のキャッシュがあり、そのクラスで定義されたメソッドのセレクタだけでなく、継承したメソッドのセレクタを含むこともできます。ディスパッチテーブルを検索する前に、メッセージングルーチンはまず、受信側オブジェクトのクラスのキャッシュを確認します(一度使用したメソッドは再度使用する可能性があるため)。キャッシュにメソッドセレクタがある場合、メッセージングは関数呼び出しより若干遅いだけです。キャッシュを「ウォームアップ」するのに十分な時間、プログラムが実行されると、そのプログラムが送信するほとんどすべてのメッセージは、対応するキャッシュされたメソッドが見つかります。プログラムの実行に伴い、新しいメッセージに対応するため、キャッシュは動的に成長します。



< 前ページ次ページ >


Last updated: 2007-10-31




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
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