2012-01-26 9 views
0

私は他人のコードに取り組んでいます。コードの行を見つけたこのコードでNSThreadを使用する

[NSThread detachNewThreadSelector:@selector(myMethod) toTarget:self withObject:nil]; 

私は質問する2つの質問があります。

  1. そのメソッドを呼び出すだけです。なぜNSThreadをここで使用していますか?
  2. コードを実行しているときに、このメソッドが呼び出されないことがあります。メソッドの中にブレークポイントを置くと、常に呼び出されます。しかし、ブレークポイントを削除すると、メソッドが呼び出されないことがあります。これはNSThreadの問題ですか?

答えて

3

このようにNSThreadを使用すると、メソッド「myMethod」がバックグラウンドスレッドでコードの他の部分と同時に呼び出されていることを意味します。実行という事実、つまり、メソッドが呼び出される(または呼び出さないように見せかけ)取得されていない場合

[self performSelectorInBackground:@selector(myMethod) withObject:nil]; 

を、それがダウンして並行性の問題になることがあります。それはあなたにも見ている可能性がある、これに相当しますそのメソッドの順序とメインスレッドの後に呼び出すものは保証されていないので、実際に呼び出されるより早く呼び出されることを期待しています。

は、あなたが言う場合:

[NSThread detachNewThreadSelector:@selector(methodA) toTarget:self withObject:nil]; 
[self methodB]; 

はその後methodAとmethodBは同時にでを実行され、methodAはmethodB前に終了する保証はありません。

2

私はいつものように、自動解放プールと組み合わせてNSThread detachNewThreadSelectorを使用します。

-(void)myMethod { 
     NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 
     // .. Do stuff in this thread 
     [pool release]; 
    }; 

あなたが「単に」セレクタを実行したい場合は、このようにそれを実行します。

[self performSelector:@selector(myMethod)]; 
+0

最近は@autoreleasepool {...}を使うべきですが、これは良いアドバイスです。 –

+0

ARC '@ autoreleasepool'ブロックを使用する場合、その方法はありますが、それ以外の場合は大丈夫です:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference /Reference.html。 '@ autorelease'ブロックはより効率的です。 – basvk

+0

@autoreleasepoolブロックは、実際にはさらに性能が優れています。追加のオブジェクトの作成やいくつかのobjective-Cメソッド呼び出しを排除します。彼らは、シンタックス・シュガーだけではありません。 –

関連する問題