7

PerformSelectorの役割は何ですか?

比較:

[self btnClicked];

[self performSelector:@selector(btnClicked)];

-(void)btnClicked
{
    NSLog(@"Method Called");
}

どちらも私にとっては元気です。これら2つの違いは何ですか。[self btnClicked]および[self performSelector:@selector(btnClicked)];

4

5 に答える 5

10

示したように、この2つは使用するとまったく同じですが、後者には、実行時に呼び出すセレクターを動的に決定できるという利点があります。

SEL selector = [self gimmeASelectorToCall];
[self performSelector: selector];

[ソース]

于 2012-07-18T10:42:36.073 に答える
8

Appledocはあなたの友達です。

NSObjectプロトコルリファレンス

それ

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

特に:

このperformSelector:方法は、aSelectorメッセージを受信者に直接送信するのと同じです。たとえば、次の3つのメッセージはすべて同じことを行います。

id myClone = [anObject copy];
id myClone = [anObject performSelector:@selector(copy)];
id myClone = [anObject performSelector:sel_getUid("copy")];

ただし、performSelector:メソッドを使用すると、実行時まで決定されないメッセージを送信できます。変数セレクターを引数として渡すことができます。

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation();
[anObject performSelector:myMethod];

aSelector引数は、引数をとらないメソッドを識別する必要があります。オブジェクト以外のものを返すメソッドの場合は、NSInvocationを使用します。

お役に立てば幸いです。

于 2012-07-18T10:50:28.837 に答える
5

オブジェクトを使用するselectorと、コンパイル時にわからないメソッドを呼び出すことができます。メソッドを呼び出すには、メソッドの名前だけを文字列として知っている必要があります。

呼び出しているメソッドの名前がコンパイル時にわかっている場合、セレクターを使用すると逆効果になります。コードが読みにくくなり、明らかな利点がなくなります。ライブラリとは別にコンパイルされた他のコードでメソッドを呼び出す必要があるライブラリを作成している場合、セレクターは2つのコードを分離する方法を提供します。

たとえば、時間間隔が過ぎたときにコールバックできるタイマークラスを作成している場合、タイマーは呼び出す必要のある関数の名前を知らないため、次のようなものを作成することはできません。

// We do not know if the function is called intervalHasExpired or something else
[target intervalHasExpired];

ただし、タイマーにセレクターを指定すると、タイマーがコールバックできるようになります。

[myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)];
于 2012-07-18T10:43:01.227 に答える
2

PerformSelectorを使用すると、プレーンCのような言語とは対照的に、基本的に実行時に渡すメッセージ(遅延バインディング)を決定できます。ObjectiveCクラスのメソッドの名前がわかっている場合は、次を使用できます。

NSSelectorFromString()

文字列をセレクターに変換し、performSelectorを使用してクラスにそのセレクターを呼び出させるには。このようにして、実行時に呼び出すさまざまな関数を選択できます。構成ファイルを使用して、呼び出す関数を選択することもできます。

于 2012-07-18T10:48:12.617 に答える
1

performSelectorクラスで宣言および実装されたメソッドを呼び出します。これは、コード内のアクションをイベントに添付する必要がある場合に使用されます。

于 2012-07-18T10:41:10.170 に答える