2011-01-18 3 views
1

익명 기능을 NSThread::detachNewThreadSelector를 사용하려고 목적C NSThread와 익명 함수가

내가 응용 프로그램을 실행하기 위해 노력하고있어
void (^testA)(void) =^
{ 
NSAutoreleasePool *oPool = [[NSAutoreleasePool alloc] init]; 

NSLog(@"in threadA",nil); 

[oPool release]; 
}; 

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

내가 가지고 오류 :

*** 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을 잊지 마세요. 그렇지 않으면 충돌이 일어날 수 있습니다.