4

ディープ カウンター ループを実行するためのテスト アプリを 1 つ作成しました。performSelectorInBackground と NSOperation サブクラスを別々に使用して、バックグラウンド スレッドでループ関数を実行します。

また、performSelectorOnMainThread を使用して backgroundthread メソッド内でメイン スレッドに通知し、NSOperation サブクラス内で [NSNotificationCenter defaultCenter] postNotificationName を使用してメイン スレッドに UI の更新を通知します。

最初は両方の実装で同じ結果が得られ、問題なく UI を更新できました。私が見つけた唯一の違いは、2 つの実装間のスレッド数です。

performSelectorInBackground 実装は 1 つのスレッドを作成し、ループが終了した後に終了し、アプリのスレッド数が再び 1 になりました。

NSOperation サブクラスの実装は 2 つの新しいスレッドを作成し、アプリケーションに存在し続けます。main() 関数でループが終了した後、3 つのスレッドが表示されます。

それで、私の質問は、NSOperation によって作成された 2 つのスレッドと、最初のバックグラウンド スレッドの実装のように終了しなかった理由です。

私は少し混乱しており、パフォーマンスとメモリ管理の観点からどの実装が最適かを判断できません。

4

1 に答える 1

6

オペレーション キューがスレッドを維持し、新しいオペレーションが現れるのを待っている可能性があります。

操作キューは多くの操作で効率的に機能するように設計されているため、操作ごとにスレッドを作成および破棄するとパフォーマンスが低下することを覚えておく必要があります。したがって、あなたが見ているのはおそらく、スレッドのプールを維持することによってキューが機能するように設計されている方法です。

基本的に、操作キューを適切に使用し、ドキュメントに従っている限り、私はそれについて心配しません。

于 2010-05-29T13:43:13.237 に答える