|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
動的バインディングを回避する唯一の方法は、メソッドのアドレスを取得し、関数のようにメソッドを直接呼び出すことです。これは、特定のメソッドを何回も連続して実行する場合に、メソッド実行のたびに生じるメッセージングのオーバヘッドを回避したいときのような、まれな状況に適しています。
NSObjectクラスで定義されているメソッドmethodForSelector:を使えば、メソッドを実装するプロシージャへのポインタを要求し、返されたポインタを使用してプロシージャを呼び出すことができます。methodForSelector:が返すポインタは、適切な関数型に慎重にキャストしなければなりません。戻り型と引数型の両方をキャストに含める必要があります。
次の例は、setFilled:メソッドを実装するプロシージャを呼び出す方法を示しています。
void (*setter)(id, SEL, BOOL); |
int i; |
setter = (void (*)(id, SEL, BOOL))[target |
methodForSelector:@selector(setFilled:)]; |
for ( i = 0; i < 1000, i++ ) |
setter(targetList[i], @selector(setFilled:), YES); |
プロシージャに渡す最初の2つの引数は、受信側オブジェクト(self)とメソッドセレクタ(_cmd)です。これらの引数はメソッド構文では隠されていますが、メソッドを関数として呼び出すときには明示する必要があります。
動的なバインディングを回避するためにmethodForSelector:を使用すると、メッセージングに必要な時間のほとんどを節約できます。しかし、節約が差を生むのは、上記のforループのように、特定のメッセージを何度も繰り返す場合だけです。
methodForSelector:はCocoaランタイムシステムが提供しているもので、Objective-C言語自身の機能ではないことに注意してください。
| < 前ページ次ページ > |
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 |