是否需要在 GCD 中的块内创建 NSAutorelease asePool?

通常,如果在 NSOperationQueue 上生成后台线程或运行 NSOperation,则需要为该线程或操作创建 NSAutorelease asePool,因为默认情况下不存在这些线程或操作。

同样的规则是否适用于放置在 Grand Central Dispatch 队列中并将在非主线程上运行的块?也就是说,是否需要在分派到主队列以外的任何内容的每个块中创建 NSAutorelease asePool?

在我有限的测试中,我没有看到针对自动发布对象的控制台警告,您通常会在后台线程或 NSOperations 中看到这些警告。然而,我似乎找不到这方面的明确文件,所以我想知道是否有人可以指出这是陈述在哪里。

11101 次浏览

同样的规则是否适用于块 位于中央车站内 分派队列,并将在 非主线程? 也就是说,你需要 内创建 NSAutorelease asePool 你派出的每一个街区 除了主队外?

大中央调度将自动管理每个队列的自动释放池。但是,不能保证池何时被排干; 可能在处理一个块之后,也可能在处理数百个块之后(但可能不会)。

所以,如果你只是分配一些对象,不用担心。但是,如果要分配任意数量的对象(并且因为要针对内存受限的环境) ,那么应该创建和清除池。


文档已经更新。

Https://developer.apple.com/library/content/documentation/general/conceptual/concurrencyprogrammingguide/operationqueues/operationqueues.html#//apple_ref/doc/uid/tp40008091-ch102-sw1

如果您的块创建了多个 Objective-C 对象,那么您可能需要 希望将块的部分代码包含在@autorelease 块中 处理这些对象的内存管理。虽然 GCD 分派 队列有自己的自动释放池,它们不保证 如果你的应用程序是内存 约束,创建您自己的自动发布池允许您释放 以更有规律的时间间隔自动释放对象的存储器。