2011-01-18 20 views
1

私はアプリケーションを実行しようとしているときObjective CのNSThreadと匿名関数

void (^testA)(void) =^
{ 
NSAutoreleasePool *oPool = [[NSAutoreleasePool alloc] init]; 

NSLog(@"in threadA",nil); 

[oPool release]; 
}; 

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

匿名関数でNSThread::detachNewThreadSelectorを使用しようとすると、私はエラーを得た:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSThread initWithTarget:selector:object:]: target does not implement selector (*** -[__NSGlobalBlock__ testA])' 

は、誰もがそれを私の手を与えることができます?

答えて

1

ちょうどそのようには機能しません。セレクタはメソッドの名前であり、ブロックはメソッドではないため、セレクタを使用してブロックを呼び出すことはできません。ブロックをバックグラウンドで実行する場合は、NSBlockOperationまたはdispatch_async()を使用できます。

2

API NSThreadを使用するには、オブジェクトとセレクタがあります。ブロックはという技術的にはオブジェクトですが、呼び出すことのできるメソッドはありません。このように、actionパラメータで渡すことのできるものはありません。あなたが非同期的にブロックを実行したい場合は

、あなたがそれを行うことができますカップルの方法があります。

  • 使用グランドセントラル派遣のdispatch_async()機能、あるいは適切なバリアントの一つ。
  • ブロックをNSBlockOperationに割り当て、それをNSOperationQueueに渡します。
  • ブロックパラメータを受け取り、単純に実行するオブジェクトにメソッドを作成し、オブジェクトとセレクタをブロックと共にNSThread APIに渡します。最初にブロック-copyを忘れないでください。そうしないと、おそらくクラッシュします。