使用NSOperationQueue在单独的线程上创建自动释放的对象

时间:2011-02-03 13:48:11

标签: iphone objective-c multithreading cocoa autorelease

这是关于自动释放,Cocoa线程和NSOperationQueue的一般性问题。

我正在使用NSOperationQueue执行某些API调用,解析结果并将其返回给主线程。 NSOperationQueue在新线程上执行这些操作。如果我每次启动新线程时都能正确理解,则会在该线程周围创建一个自动自动释放池,该线程在线程完成时释放。

这是给我带来麻烦的情况。我将分配的NSArray传递给NSOperationQueue。在操作期间,数组将填充一堆自动释放的对象,这些对象将被创建。然后将数组返回到主线程。

  1. 由于在线程上创建了自动释放的对象,它们是否会被释放?根据我的理解,他们不应该因为他们的参考数是1,在他们被加入NSArray之后。

  2. 谁现在拥有发布这些对象?自动释放是否神奇地将责任传递给主线程自动释放池。

  3. 如果我自己创建线程而不是使用NSOperationQueue会不会有任何不同?

  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

NSOperation需要为他们创建NSAutoReleasePool

-(void)main
{
   NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];

   //All NSOperation code here

   [pool drain];
}
  1. 不,您可能会在控制台中收到有关没有自动释放池的警告。将它们添加到数组会使引用数增加1,但如果没有NSAutoReleasePool,引用计数对于正确的内存管理来说太高了。
  2. 您负责为该线程创建自动释放池并将其耗尽。如果你的操作没有在主线程上运行,它们不会神奇地被放入主线程的池中。
  3. 没有您负责创建自动释放池的每个线程。