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

Posted

技术标签:

【中文标题】使用 NSOperationQueue 在单独的线程上创建自动释放的对象【英文标题】:Creating autoreleased objects on separate threads with NSOperationQueue 【发布时间】:2011-02-03 13:48:11 【问题描述】:

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

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

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

    既然自动释放的对象是在线程上创建的,它们会被释放吗?据我了解,在将它们添加到 NSArray 之后,它们的引用计数为 1,因此不应该这样做。

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

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

谢谢!

【问题讨论】:

***.com/questions/184409/… 这里也有类似的讨论,但并没有完全解决我的问题。 【参考方案1】:

NSOperations 需要为他们创建一个NSAutoReleasePool

-(void)main

   NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];

   //All NSOperation code here

   [pool drain];

    不,您可能会在控制台中收到关于不存在自动释放池的警告。将它们添加到数组中会使引用计数增加 1 是正确的,但如果没有 NSAutoReleasePool,引用计数将太高而无法进行正确的内存管理。 您负责为该线程创建自动释放池并将其排空。如果您的操作不在主线程上运行,它们不会神奇地放入主线程的池中。 没有您负责创建自动释放池的每个线程。

【讨论】:

谢谢乔。对于 2,我不明白的是,当子线程退出时,如何将 ref count>0 的对象的责任转移到主线程自动释放池。这是错误的思考方式吗? 当您调用 -[NSAutoReleasePool drain] 时,它将正确取消引用任何保留对象,并且此时保留计数为 0 的所有对象都将被释放。 谢谢乔,这已经回答了我的问题。

以上是关于使用 NSOperationQueue 在单独的线程上创建自动释放的对象的主要内容,如果未能解决你的问题,请参考以下文章

NSOperationQueue 和并发操作

在单个 NSOperationQueue iOS 中管理多个操作,例如暂停/恢复单个操作

如何在具有多个组的箱线图顶部创建单独的线

NSOperationQueue 阻塞不相关的 NSOperationQueue?

iphone ios在单独的线程中运行

NSOperationQueue 和内存