2009-05-15 19 views
6

Tôi muốn gửi một đối tượng về chủ đề chính từ chuỗi công nhân. Tuy nhiên, các bể tự động giải phóng có hoạt động giữa các luồng không? Có điều gì sai với mã sau không:Các bể đa luồng và tự động làm việc cùng nhau trong ca cao?

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

} 

Dường như hoạt động tốt. Tuy nhiên, có thể chuỗi công nhân có thể đạt tới [pool release] trước khi chủ đề chính có thể giữ lại nó không?

Trả lời

7

Mã của bạn nên không sụp đổ: performSelectorOnMainThread: giữ đối số của nó cho đến khi kết thúc chọn, vì vậy giữ lại của bạn/release cặp là không cần thiết.

Xem the documentation:

Phương pháp này vẫn giữ được người nhận và tham số arg cho đến khi chọn được thực hiện.

Ngoài ra: có thể bạn nên [pool drain] thay vì [pool release].

+0

ok cảm ơn vì mẹo –

0

This có thể trả lời câu hỏi của bạn.

Đây là những gì anh đã làm để giải quyết vấn đề. Giải thích được đưa ra trong liên kết đó.

- (void)runSomethingThatWillFail:(NSError **)error { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSArray *directoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/BOGUS" error:error]; 
    [*error retain]; 
    [pool release]; 
    [*error autorelease]; 
} 
Các vấn đề liên quan