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

标签 iphone objective-c multithreading cocoa autorelease

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

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

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

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

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

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

谢谢!

最佳答案

NSOperation 需要为其创建一个 NSAutoReleasePool

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

   //All NSOperation code here

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

关于iphone - 使用 NSOperationQueue 在单独的线程上创建自动释放的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886892/

相关文章:

ios - 如何从速度、位置等 map 获取实时数据?是否可以?

iOS崩溃报告

ios - 管理推送通知横幅文本

ios - 在 XCode 7 中导入带有类别扩展的接口(interface)时编译和运行时失败

iPhone 默认数据

java - 同步相对于锁 API 的优势

ios - 将 PDF 文件附加到电子邮件 - Swift

objective-c - Obj-C,一切的属性

python - flask 中的线程数

c++ - 在微服务C++中运行gRPC服务器