9

何をしperformSelectorますか?NSThread新規作成とperformSelectorメソッドの違いは何ですか?

どのように機能し、どこで使用する必要がありますか?

4

2 に答える 2

23

これらはすべて同じタスクを実行します。つまり、doStuffメソッドを現在のスレッドanObjectで同期的に実行します。

// 1
[anObject doStuff];

// 2
[anObject performSelector:@selector(doStuff)];

// 3
objc_msgSend(anObject, @selector(doStuff));

// 4
IMP imp = [anObject methodForSelector:@selector(doStuff)];
imp(anObject, @selector(doStuff));
  1. これは、通常、物事を行う方法です。
  2. メッセージを動的にディスパッチするためのものです。セレクターが不明な場合、またはターゲット アクション パターンを実装する場合など、クライアントによって提供される場合に使用します。のクラスanObjectが不明な場合は、通常、オブジェクトに のメソッドがあるかどうかを最初に尋ねることによって使用されます-[NSObject respondsToSelector:]
  3. 1.が実際にコンパイルされたものです。通常、これを行う必要はまったくありません。
  4. メソッドの実際のIMP (実装)をキャッシュし、それを直接呼び出します。タイトなループで使用すると、1. よりも速くなることがあります。覚えとけ; 時期尚早の最適化は悪です。

把握する必要があるのは、Objective-C ではクラス/インターフェイスよりもメソッドが重要であるということです。通常、オブジェクトが特定のクラスに属している場合、またはコンパイラが不平を言うためのプロトコルに準拠している場合は、オブジェクトを照会しません。実行時に、代わりに特定のメソッドを照会します。

要するに、あなたが何であるかは問題ではなく、何ができるかだけです.

便宜上、非同期NSObjectの兄弟もいくつか持っています。performSelector最も注目すべき点:

  • performSelector:withObject:afterDelay:- 遅延後に現在のスレッドでメソッドを実行する。
  • performSelectorInBackground:withObject:- 新しいバックグラウンド スレッドでメソッドを実行する。
  • performSelectorOnMainThread:withObject:waitUntilDone:- メインスレッドでメソッドを実行する。
  • performSelector:onThread:withObject:waitUntilDone:- 任意のスレッドでメソッドを実行する。

非同期実行者はすべて to 関数に依存しNSRunLoopます。自分でスレッドを生成しない限り、これは気にする必要はありません。その場合は、新しいスレッド実行ループも実行する必要があります。今のところそれをスキップしてください。

于 2010-11-30T15:48:32.130 に答える
2

performSelectorセレクターを実行します。つまり、メソッドを呼び出します。

これは、新しいスレッドを実行することとは大きく異なります。

セレクターを読んでおくのが一番いいと思います。

于 2010-11-30T12:51:08.483 に答える