何をしperformSelector
ますか?NSThread
新規作成とperformSelector
メソッドの違いは何ですか?
どのように機能し、どこで使用する必要がありますか?
何をしperformSelector
ますか?NSThread
新規作成とperformSelector
メソッドの違いは何ですか?
どのように機能し、どこで使用する必要がありますか?
これらはすべて同じタスクを実行します。つまり、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));
anObject
が不明な場合は、通常、オブジェクトに のメソッドがあるかどうかを最初に尋ねることによって使用されます-[NSObject respondsToSelector:]
。IMP
(実装)をキャッシュし、それを直接呼び出します。タイトなループで使用すると、1. よりも速くなることがあります。覚えとけ; 時期尚早の最適化は悪です。把握する必要があるのは、Objective-C ではクラス/インターフェイスよりもメソッドが重要であるということです。通常、オブジェクトが特定のクラスに属している場合、またはコンパイラが不平を言うためのプロトコルに準拠している場合は、オブジェクトを照会しません。実行時に、代わりに特定のメソッドを照会します。
要するに、あなたが何であるかは問題ではなく、何ができるかだけです.
便宜上、非同期NSObject
の兄弟もいくつか持っています。performSelector
最も注目すべき点:
performSelector:withObject:afterDelay:
- 遅延後に現在のスレッドでメソッドを実行する。performSelectorInBackground:withObject:
- 新しいバックグラウンド スレッドでメソッドを実行する。performSelectorOnMainThread:withObject:waitUntilDone:
- メインスレッドでメソッドを実行する。performSelector:onThread:withObject:waitUntilDone:
- 任意のスレッドでメソッドを実行する。非同期実行者はすべて to 関数に依存しNSRunLoop
ます。自分でスレッドを生成しない限り、これは気にする必要はありません。その場合は、新しいスレッド実行ループも実行する必要があります。今のところそれをスキップしてください。