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

Iphone 使用NSOperationQueue在独立线程上创建自动释放对象,iphone,objective-c,multithreading,cocoa,autorelease,Iphone,Objective C,Multithreading,Cocoa,Autorelease,这是一个关于自动释放、Cocoa线程和NSOperationQueue的一般性问题 我使用NSOperationQueue执行某些API调用,解析结果并将其返回到主线程。NSOperationQueue在新线程上执行这些操作。如果我理解正确的话,每次启动一个新线程时,都会在该线程周围创建一个自动释放池,该池在线程完成时释放 这就是给我带来麻烦的案子。我将分配的NSArray传递给NSOperationQueue。在操作过程中,数组将填充一组创建的自动释放对象。然后数组返回到主线程 既然自动释放的

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

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

这就是给我带来麻烦的案子。我将分配的NSArray传递给NSOperationQueue。在操作过程中,数组将填充一组创建的自动释放对象。然后数组返回到主线程

  • 既然自动释放的对象是在线程上创建的,那么它们会被释放吗?据我所知,他们不应该这样做,因为他们的ref计数是1,在他们被添加到NSArray之后

  • 现在谁拥有这些物品?自动释放是否神奇地将责任传递给了主线程自动释放池

  • 如果我自己创建线程而不是使用NSOperationQueue,这会有什么不同吗


  • 谢谢大家!

    NSOperation
    s需要为其创建一个
    NSAutoReleasePool

    -(void)main
    {
       NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
    
       //All NSOperation code here
    
       [pool drain];
    }
    
  • 不,您可能会在控制台中得到一个警告,提示没有自动释放池存在。将它们添加到数组将使ref计数增加1是正确的,但是如果没有NSAutoReleasePool,ref计数将过高,无法进行适当的内存管理
  • 您负责为该线程创建自动释放池并将其排空。如果您的操作没有在主线程上运行,它们不会神奇地被放入主线程上的池中
  • 没有负责创建自动释放池的每个线程

  • 谢谢你,乔。对于2,我不知道如何在子线程退出时将ref count>0的对象的责任转移到主线程自动释放池。这是一种错误的想法吗?当您调用
    -[NSAutoReleasePool drain]
    时,它将正确地取消对任何保留对象的引用,并且此时保留计数为0的所有对象都将被解除分配。谢谢Joe,这已经回答了我的问题。这里有类似的讨论,但没有完全解决我的问题。