Objective-C のセレクターは、オブジェクトにメッセージを送信する別の方法ですか? なぜ、どのようにそれらを使用するのか、私は本当に理解していません。
5 に答える
セレクターは通常、コールバック メカニズムを定義する場合に使用されます。Cocoa でのセレクターの最も一般的な使用例は、ボタンなどのコントロールです。AUIButton
は非常に汎用的であり、ボタンが押されたときに何が起こるかわかりません。使用する前に、ボタンが押されたときに実行するメソッドを指定する必要があります。これは次のように行われます。
[myButton addTarget:self
action:@selector(myButtonWasPressed)
forControlEvents:UIControlEventTouchUpInside];
- (void)myButtonWasPressed {
// Do something about it
}
次に、ボタンが押されると、ボタンは渡されたターゲットのセレクターを呼び出します。このメカニズムを使用すると、独自のコードを呼び出すたびにボタンをサブクラス化する必要がなくなります。代わりに、UIButton
それ自体が、選択した任意のコードにディスパッチするための汎用メカニズムを備えています。(技術的にはUIControl
、ディスパッチ メカニズムを提供するのはスーパークラスです。)
これらはオブジェクトにメッセージを送信する別の方法ではなく、唯一の方法です。たとえば、 in[myView setValue:@"foo"]
はsetValue:
セレクタです。(同じことを書く別の便利ではない方法は ですobjc_msgSend(myView, @selector(setValue:), @"foo")
。)
Ian Henry が言うように、SEL
値を使用して、コンパイル時ではなく実行時にセレクターを選択できます。これは Cocoa の基本的なテクニックです。ユーザー インターフェイスは通常、ターゲット/アクション バインディングを使用してコントローラーに接続されます。ここで、ターゲットはオブジェクトであり、アクションはセレクターです。通常、これは nib で設定しますが、コードで行うこともできます。
[myButton setTarget:myController];
[myButton setAction:@selector(buttonClicked:)]; // Clicking the button will now call [myController buttonClick:myButton].
セレクターを変数として保存し、後で、または別のコンテキストで呼び出すことができます。たとえば、特定の時間に、または別のスレッドでセレクターを実行するようにオブジェクトに指示できます。また、データに基づいて実行するセレクターを選択することもできます。これは、インターフェイス ビルダーとコア データが機能する方法です。
最も基本的なことですが、実行時にメッセージを変更できます。例えば:
SEL a = [selectorFactory getSelector];
[someOtherObject performSelector:a];
そして、でselectorFactory.getSelector
:
if(foo == 1)
return @selector(thisSelector);
else
return @selector(thatSelector);
または別の同様の言語から来てC#
、これを使用して、s を使用するよりもはるかに簡単にイベントを (大まかに) シミュレートできますNSNotification
。たとえば、 と の 2 つの ivar を持つボタン クラスを作成し、ボタンがtarget
クリックselector
されたときにターゲット上でセレクターを実行させることができます (たとえば)。
ただし、セレクターにはそれ以外にも多くの機能があります。それらの詳細については、こちらをご覧ください。