Цель C NSThread и анонимная функция - PullRequest
1 голос
/ 18 января 2011

Попытка использовать NSThread::detachNewThreadSelector с анонимной функцией

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])'

Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Чтобы использовать этот NSThread API, у вас могут быть объект и селектор.Хотя блок технически объект, у него нет методов, которые вы можете вызвать.Таким образом, в параметре action вы ничего не могли бы передать, чтобы это работало.

Если вы хотите выполнить блок асинхронно, есть несколько способов сделать это:

  • Использовать функцию dispatch_async() Grand Central Dispatch или один из соответствующих вариантов.
  • Передайте блок NSBlockOperation и передайте его NSOperationQueue.
  • Создайте метод для объекта, который принимает параметр блока и просто выполняет его, а затем передает этот объект и селектор вместе с блоком для NSThread API.Не забудьте сначала -copy блокировать, иначе вы, вероятно, потерпите крах.
1 голос
/ 18 января 2011

Просто так не работает. Селектор - это имя метода, а блок - это не метод, поэтому вы не можете использовать селектор для вызова блока. Если вы хотите выполнить блок в фоновом режиме, вы можете использовать NSBlockOperation или dispatch_async().

...