72

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

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

在我有限的测试中,我看不到自动释放对象的控制台警告,您通常会在后台线程或 NSOperations 中看到这些警告。但是,我似乎无法找到关于此的明确文档,所以我想知道是否有人可以指出这是在哪里说明的。

4

1 回答 1

111

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

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

因此,如果您只分配几个对象,请不要担心。但是,如果您要分配大量对象(并且由于您的目标是内存受限的环境),那么您应该创建和排出池。


文档已更新。

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

如果您的块创建了多个 Objective-C 对象,您可能希望将块的部分代码包含在 @autorelease 块中,以处理这些对象的内存管理。尽管 GCD 调度队列有自己的自动释放池,但它们不能保证这些池何时耗尽。如果您的应用程序受内存限制,创建您自己的自动释放池可以让您更定期地为自动释放对象释放内存。

于 2010-11-10T05:18:21.640 回答