2009-05-15 2 views
6

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

-(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], прежде чем основной поток сможет его сохранить?

ответ

7

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

См the documentation:

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

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

+0

ok спасибо за отзыв –

0

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

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

- (void)runSomethingThatWillFail:(NSError **)error { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/BOGUS" error:error]; 
    [*error retain]; 
    [pool release]; 
    [*error autorelease]; 
} 
Смежные вопросы