2009-07-05 8 views
7

メソッドディスパッチテーブルを設定したいのですが、Objective-Cのメソッドへのポインタ(Cの関数へのポインタのようなもの)を作成できるかどうか疑問です。メソッドを動的に切り替えるObjective-Cランタイム関数を使用しようとしましたが、問題はすべてのインスタンスに影響します。Objective-Cの場合...ポインタへのメソッド

私はObjective-Cを非常に新しくしているので、図示の例は高く評価されます。

答えて

16

Objective-Cメソッドは、selectorと呼ばれ、SELデータ型で表されます。あなたのオブジェクトがNSObjectから継承する場合、あなたはこれのように(つまり、メソッドを呼び出す)セレクタを実行するためにそれを伝えることができます。

-(void)doSomething:(MyObject*)arg; 

セレクタです:

SEL selector = @selector(doSomething:); 
[obj performSelector:selector withObject:argument]; 

をこれはあなたのような定義されたメソッドを持っていると仮定し@selectorキーワードを使用してSELデータ型に割り当てられます。このキーワードは、保持するメソッドの名前を取ります。メソッドの名前は、すべての引数を取り除いたメソッド名です。たとえば:

-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params 

@selector(doSomething:withParams:)として参照されます。

+0

ああ、そうです!ジェイソン、ありがとう! –

5

はい! Objective-Cでは、関数ポインタはセレクタと呼ばれます。あなたは、この方法は、次のように定義している場合:

- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2 
{ 
} 

セレクタは次のように宣言されています:

@selector(myFunctionWithObject:otherObject:) 

は、オブジェクト上でセレクタを実行するには、使用することができます。

[object performSelector:@selector(myFunction)]; 

かを

[object performSelector:@selector(myFunctionTakingParameter:) withObject: o]; 

セレクタのデータ型は、スレッドとディスパッチすることができ、スレッドに呼び出すメッセージのセレクタを提供できるスレッドとタイマーに特に便利です。セレクタ(またはディスパッチテーブル)の配列を作成する必要がある場合や、複数のパラメータでセレクタを呼び出す必要がある場合は、NSInvocationクラスを使用できます。セレクタのラッパーを提供し、実際の引数を指定することができます。

Objective-Cは、完全に動的なメソッドディスパッチテーブルに基づいています。しかし、関数への参照だけが必要な場合は、セレクタを使って関数ポインタをメンテナンスするのがうまくいくように思えます。

+0

2番目のセンテンスを次のように変更して、このように定義することができます。 – micmoo

+0

ありがとう、ベン。はい、ランタイムが完全に動的なパッチテーブルであることは間違いありません。 –

関連する問題