3

Objective Cでの実行セレクターの使用は何ですか?実行セレクターと応答セレクターの違いを教えてください。

4

3 に答える 3

5

-respondsToSelector:特定のオブジェクトが特定のセレクターに応答するかどうか、メッセージを送信した場合にアプリがクラッシュするかどうかをテストできます。


-performSelector:(withObject :)は、特定のメソッドを呼び出すだけです。

[object performSelector:@selector(retain)];

に等しい

[object retain];

なぜそれが必要なのですか?便利な例は次のように提供されNSArrayます。セレクターを、含まれているすべてのオブジェクトで実行できるようにします。

[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

に等しい

for (UIView *view in self.subviews)
{
    [view removeFromSuperview];
}

一方、-makeObjectsPerformSelector:ははるかにエレガントです。

于 2012-04-20T13:28:00.200 に答える
0

PerformSelectorの一般的な使用法は、それが有効かどうかわからないときにオブジェクトにメッセージを送信することです。

たとえば、@property (assign) id delegateインターフェイスにがidあり、は任意の種類のオブジェクトへのポインタであると仮定します。delegateそうでない場合でもnil、コードのコンパイル時にデリゲート用に作成した適切なプロトコルが実装されているかどうかはわかりません。だからあなたはできる:

if ([delegate respondsToSelector:@selector(delegateMethod:)]) {
    [delegate performSelector:@selector(delegateMethod:)
                   withObject:param];
}

これは、オブジェクトのタイプを検出する必要がある場合にも使用できます。performSelector:型キャストを回避するために使用できます。また、これにより、コンパイル時の不要な警告が排除されます。

マルチスレッドのシナリオでは、次の方法を使用することをお勧めしますNSObject

performSelectorOnMainThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:modes:
performSelector:onThread:withObject:waitUntilDone:
performSelector:onThread:withObject:waitUntilDone:modes:
performSelectorInBackground:withObject:

参照:

于 2012-04-20T13:36:02.777 に答える
0

RespondsToSelector:受信者が指定されたメッセージに応答できるメソッドを実装または継承しているかどうかを示すブール値を返します。

performSelector:指定されたメッセージを受信者に送信し、メッセージの結果を返します。

PerformSelector は、実行したいときにメソッドを呼び出すために使用されます。つまり、特定のタスクを実行するために別のオプションを選択するオプションがあることを意味します(メソッド) 例...

– performSelector:withObject:afterDelay: // 特定の遅延の後にメソッドを実行します.. – performSelector:withObject:afterDelay:inModes: – performSelectorOnMainThread:withObject:waitUntilDone: – performSelectorOnMainThread:withObject:waitUntilDone:modes: – performSelector:onThread:withObject:waitUntilDone : – performSelector:onThread:withObject:waitUntilDone:modes:

– performSelectorInBackground:withObject: // バックグラウンドでタスクを実行します。したがって、あなたの ManinThread(Application) は応答を停止しません..マルチスレッドのように..

直接法では、タスクを実行するための選択が提供されない場合..

詳細な説明については、このリファレンスを参照してください。

うまくいけば、これはあなたを助けるでしょう...

于 2012-04-20T13:13:00.830 に答える