使用 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】:NSOperation
s 需要为他们创建一个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 iOS 中管理多个操作,例如暂停/恢复单个操作