2009-05-15 11 views
6

Chciałbym wysłać obiekt z powrotem do głównego wątku z wątku roboczego. Jednak pule z automatycznym wydaniem działają między wątkami? Czy jest coś nie tak z następującym kodem:Czy pule wielowątkowości i autoreasowania współpracują ze sobą w kakao?

-(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];  

} 

Wydaje się działać poprawnie. Czy możliwe jest jednak, że wątek roboczy dotarłby pod numer [pool release], zanim główny wątek będzie w stanie go zachować?

Odpowiedz

7

Twój kod nie powinien katastrofa: performSelectorOnMainThread: zachowuje swoje argumenty dopiero po zakończeniu selektora, więc zachowują/para wydanie jest zbędny.

Zobacz the documentation:

Ta metoda zachowuje odbiornik i parametr arg aż po selektor jest wykonywana.

Również: powinieneś prawdopodobnie [pool drain] zamiast [pool release].

+0

ok dzięki za wskazówkę –

0

This może odpowiedzieć na twoje pytanie.

Oto, co zrobił, aby rozwiązać problem. Wyjaśnienie podane jest w tym łączu.

- (void)runSomethingThatWillFail:(NSError **)error { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/BOGUS" error:error]; 
    [*error retain]; 
    [pool release]; 
    [*error autorelease]; 
} 
Powiązane problemy