1

重複の可能性:
-performSelector: の使用 vs. メソッドの呼び出しのみ

次のようにして、アプリケーションで同じタスクを達成できます。

[self performSelector:@selector(displayOneLife)];

と:

[self displayOneLife];

状況に応じて、どちらか一方を使用する方が良いですか?もしそうなら、誰かが私のために詳しく説明できますか? Objective-C のベスト プラクティスを使用したいだけです。

ありがとう、ジョーイ

4

4 に答える 4

3

-performSelector アプローチは通常、コンパイル時に不明なセレクターを呼び出したい場合に使用されます。たとえば、UIButton はそれを使用して、ユーザーがボタンを押したときに接続先のアクションを呼び出します (ボタンは、IB に接続されているメソッドの名前と接続先のクラスを認識しています)。

他のすべてのケースでは、コードを判読不能なパズルに変換したくないため、後者を使用する必要があります。

PS -performSelector + 動的セレクター名の構築は、禁止された呼び出しのバイナリを探す Apple の静的アナライザーを回避するために使用できます :)

于 2012-11-09T18:20:01.260 に答える
2

@selector には非常に特殊な用途があり、既知のメソッドを呼び出すために使用しないでください。

@selector を使用して、呼び出す必要があるメソッドの 1 つを他のクラスに通知します。

たとえば、クラス countNumber にセレクターをメソッド @selector(result:) に渡して、タスクが完了したときに他のクラスがメソッドを呼び出すようにすることができます。

コード例:

- (void)calculateANumber
{
    [NumbersClass countNumber:myNumber withResult:@selector(result:)];
}

//This method will get called by NumbersClass, even tho it didnt know its existence before
- (void)result:(int)countResult
{
    myResult = countResult;
}

ほんの一例ですが、明らかに何もしません

于 2012-11-09T18:20:45.843 に答える
2

セレクターは変数に格納できるのでperformSelector:、コンパイル時に送信したいメッセージがわからない場合に便利です。たとえば、ターゲット アクション システムはセレクターに基づいています。コントロールの初歩的な実装を次に示します。

@interface FakeControl : NSObject

@property(nonatomic, strong) id target;
@property(nonatomic, assign) SEL action;

- (void)click;

@end

@implementation FakeControl

- (void)click {
    [target performSelector:action];
}

@end

セレクターを使用することで、コントロールがクリックされたときに、実行時に必要なメッセージをコントロールに送信させることができます。

于 2012-11-09T18:21:14.360 に答える
0

特に同じスレッドでインラインで何かをする必要がある場合

[self displayOneLife] 

十分です

しかし、別のスレッドで実行したい場合や、遅延などの後で実行したい場合がたくさんあります。メソッドのシグネチャは、その機能を理解するのに役立ちます。

メソッドの 1 つを選択し、メソッド名をコマンド クリックするだけです。メソッドの機能などの詳細が表示されます。

とても良い質問ですが、多くの答えがあります。ランループ、スレッド、遅延、非同期操作がすべての理由です。

于 2012-11-09T18:20:27.907 に答える