Работают ли многопоточные и авто-релизные пулы вместе в Какао? - PullRequest
6 голосов
/ 16 мая 2009

Я хотел бы отправить объект обратно в основной поток из рабочего потока. Однако работают ли пулы автоматического выпуска между потоками? Что-то не так с кодом:

-(void)mainThreadReceiveResult:(id)response
{
  [response retain];
    /* Do some stuff with response */
  [response release];
}


-(void)workerThreadDoWork
{

 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 response * response = [[[response alloc] init] autorelease];
 response->someData = [self getSomeData];

 [delegate performSelectorOnMainThread:@selector(receiveResult:) withObject:response waitUntilDone:NO];

 [pool release];    

}

Кажется, работает нормально. Однако возможно ли, что рабочий поток достигнет [pool release], прежде чем основной поток сможет его сохранить?

Ответы [ 2 ]

7 голосов
/ 16 мая 2009

Ваш код не должен аварийно завершать работу: performSelectorOnMainThread: сохраняет свои аргументы до тех пор, пока селектор не завершит работу, поэтому ваша пара сохранения / освобождения излишня.

См. документацию :

Этот метод сохраняет приемник и параметр arg до тех пор, пока не будет выполнен селектор.

Также: вам, вероятно, следует [pool drain] вместо [pool release].

0 голосов
/ 16 мая 2009

Это может ответить на ваш вопрос.

Вот что он сделал, чтобы решить проблему. Объяснение дано по этой ссылке.

- (void)runSomethingThatWillFail:(NSError **)error {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/BOGUS" error:error];
   [*error retain];
   [pool release];
   [*error autorelease];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...