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

时间:2010-11-10 04:02:17

标签: iphone objective-c cocoa macos grand-central-dispatch

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

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

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

1 个答案:

答案 0 :(得分:109)

  

相同的规则是否适用于块   位于大中央区   调度队列并将在一个上运行   非主线程?那就是你需要的吗?   在其中创建一个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派遣   队列有自己的自动释放池,他们不保证   当那些池被排干时。如果您的应用程序是内存   约束,创建自己的自动释放池可以让你自由   更自定义的自动释放对象的内存。