这是一个关于自动释放、Cocoa 线程和 NSOperationQueue 的一般问题。
我正在使用 NSOperationQueue 执行某些 API 调用、解析结果并将其返回到主线程。 NSOperationQueue 在新线程上执行这些操作。如果我理解正确的话,每次启动一个新线程时,都会围绕该线程创建一个自动释放池,该池会在线程完成时释放。
这是给我带来麻烦的情况。我将分配的 NSArray 传递给 NSOperationQueue。在操作过程中,数组中填充了一堆创建的自动释放的对象。然后数组返回到主线程。
既然自动释放的对象是在线程上创建的,它们会被释放吗?据我了解,在将它们添加到 NSArray 后,它们不应该出现,因为它们的引用计数为 1。
现在谁拥有释放这些对象的权利?自动释放是否神奇地将责任传递给主线程自动释放池。
如果我自己创建线程而不是使用 NSOperationQueue,这会有所不同吗?
谢谢!
最佳答案
NSOperation
需要为其创建一个 NSAutoReleasePool
。
-(void)main
{
NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
//All NSOperation code here
[pool drain];
}
- 不,您可能会在控制台中收到有关不存在自动释放池的警告。将它们添加到数组中将使引用计数增加 1,这是事实,但如果没有 NSAutoReleasePool,引用计数对于正确的内存管理来说会太高。
- 您负责为该线程创建自动释放池并耗尽它。如果您的操作不在主线程上运行,它们不会神奇地放入主线程的池中。
- 没有您负责创建自动释放池的每个线程。
关于iphone - 使用 NSOperationQueue 在单独的线程上创建自动释放的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886892/