多线程和自动释放池在Cocoa中一起工作吗?

时间:2009-05-15 21:05:38

标签: objective-c cocoa multithreading

我想将一个对象从工作线程发送回主线程。但是,自动释放池是否在线程之间工作?以下代码有什么问题:

-(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 个答案:

答案 0 :(得分:7)

您的代码不应该崩溃:performSelectorOnMainThread:在选择器完成之前保留其参数,因此您的保留/释放对是多余的。

请参阅the documentation

  

此方法保留接收器和arg参数,直到执行选择器之后。

另外:您应该[pool drain]而不是[pool release]

答案 1 :(得分: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];
}