Apple Developer Connection
Advanced Search
Member Login 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




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