首页 文章

您是否需要在GCD的块内创建NSAutoreleasePool?

提问于
浏览
73

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

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

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

1 回答

  • 109

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

    Grand Central dispatch将自动管理每个队列的自动释放池 . 但是,无法保证游泳池的排水时间;可能是在处理了一个块之后,它可能在数百个之后(但可能不会) .

    因此,如果您只分配一些对象,请不要担心 . 但是,如果要分配任意数量的对象(并且因为您的目标是内存受限环境),那么您应该创建和排空池 .


    文档已更新 .

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

    如果您的块创建了多个Objective-C对象,您可能希望将块的代码部分包含在@autorelease块中,以处理这些对象的内存管理 . 尽管GCD调度队列具有自己的自动释放池,但它们无法保证这些池何时耗尽 . 如果您的应用程序受内存限制,则创建自己的自动释放池允许您以更加规则的间隔释放自动释放对象的内存 .

相关问题