2011-06-30 12 views
9

彼らは合理的に似たような仕事をしているようです。そのセレクタをすばやく簡単に実行する新しいスレッドを起動します。しかし、違いはありますか?メモリ管理に関してはどうですか?+ [NSThread detachNewThreadSelector:toTarget:withObject:]と - [NSObject performSelectorInBackground:withObject:]の違いは何ですか?

+1

良い質問。私は 'perfomSelectorInBackground'が(libdispatch'を介して)プールからのスレッドを再利用するかもしれないと言うつもりでしたが、ドキュメントは明示的に新しいスレッドを作成すると言います。だからええ、それは 'NSThread'メソッドとまったく同じことをするようです... –

答えて

4

どちらも同じです。

iOSとMac OS X v10.5以降では、すべてのオブジェクトが新しいスレッドを生成し、そのメソッドを使用してメソッドの1つを実行できます。 performSelectorInBackground:withObject:メソッドは、新しいデタッチされたスレッドを作成し、指定されたメソッドを新しいスレッドのエントリポイントとして使用します。あなたには、いくつかのオブジェクトを持っている(変数このmyobjによって表される)と、そのオブジェクトを使用すると、バックグラウンドスレッドで実行したいのdoSomethingというメソッドを持っている場合たとえば、あなたはそれを行うには、次のコードを使用することができますできます

[myObj performSelectorInBackground:@selector(doSomething) withObject:nil]; 

このメソッドを呼び出す効果は、現在のオブジェクト、セレクタ、およびパラメータオブジェクトをパラメータとして持つNSThreadのdetachNewThreadSelector:toTarget:withObject:メソッドを呼び出した場合と同じです。新しいスレッドは、デフォルト構成を使用してすぐに生成され、実行を開始します。セレクタの内部では、スレッドと同じようにスレッドを構成する必要があります。たとえば、自動解放プール(ガベージコレクションを使用していない場合)を設定し、スレッドの実行ループを使用するように設定する必要があります。新しいスレッドを構成する方法の詳細については

0

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;はNSThread.hのNSObject (NSThreadPerformAdditions)カテゴリに定義されているので、同じものと見なします。それは決定的なものではありませんが、それはその方向性の証拠です。

+0

私はちょうどテストを行いました、どちらもあなたのために自動解放プールを設定しません。 –

関連する問題