Objective-Cの...ポインタのための方法
-
23-08-2019 - |
質問
私はセットアップにメソッドのディスパッチテーブルをしたいし、(ポインタのようにCで機能する)のObjective-Cのメソッドへのポインタを作成することが可能である場合、私は疑問に思って。私は、動的にメソッドを切り替えるために、いくつかのObjective-Cランタイム関数を使用しようとしたが、問題は、それがすべてのインスタンスに影響しますです。
Iは、Objective-Cのに非常に新しいですように、、図示の例では高く評価されるだろう。
解決
Objective-Cのメソッドはselector
sと呼ばれ、SEL
データ型で表されます。あなたのオブジェクトがNSObject
から継承する場合、あなたはこのようにように(すなわち、メソッドを呼び出す)セレクタを実行するためにそれを伝えることができます:
SEL selector = @selector(doSomething:);
[obj performSelector:selector withObject:argument];
これは、次のような定義されたメソッドを持っていると仮定し
-(void)doSomething:(MyObject*)arg;
セレクタは、あなたが維持したいメソッドの名前をとりSEL
キーワードを通じてデータ型を@selector
するために割り当てられています。メソッドの名前は、すべての引数を剥奪メソッド名です。たとえばます:
-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params
@selector(doSomething:withParams:)
として参照されます。
他のヒント
はい! 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のは、すでに完全に動的メソッドディスパッチテーブルに基づいていることを心に留めておく必要があります。それはあなたがちょうどしかし、関数への参照が必要な場合はあなたのために正常に動作しますセレクタを使用して関数ポインタを維持するように聞こえるます。