你需要在GCD块中创build一个NSAutoreleasePool吗?

通常情况下,如果你产生一个后台线程或在NSOperationQueue上运行一个NSOperation,你需要为该线程或操作创build一个NSAutoreleasePool,因为默认情况下不存在。

相同的规则是否适用于位于Grand Central Dispatch队列中并将在非主线程上运行的块? 也就是说,是否需要在每个块中创build一个NSAutoreleasePool,然后将其分派给主队列以外的任何其他块?

在我有限的testing中,我没有看到通常用后台线程或NSOperation看到的自动释放对象的控制台警告。 但是,我似乎无法find明确的文件,所以我想知道是否有人可以指出这是说。

相同的规则是否适用于位于Grand Central Dispatch队列中并将在非主线程上运行的块? 也就是说,是否需要在每个块中创build一个NSAutoreleasePool,然后将其分派给主队列以外的任何其他块?

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

所以,如果你只是分配一些对象,不要担心。 但是,如果您正在分配大量的对象(并且因为您的目标是内存受限的环境),那么您应该创build和抽取池。


文档已更新。

请参阅https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

如果您的块创build了多个Objective-C对象,则可能需要将块的部分代码放在@autorelease块中,以处理这些对象的内存pipe理。 尽pipeGCD调度队列拥有自己的自动释放池,但是他们无法保证这些池的耗尽时间。 如果您的应用程序受到内存限制,创build您自己的自动释放池允许您以更有规律的间隔释放自动释放对象的内存。