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


71

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

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

在有限的测试中,我没有看到通常在后台线程或NSOperation中看到的自动释放对象的控制台警告。但是,我似乎找不到关于此的权威文档,因此我想知道是否有人可以指出该声明的位置。


从@Gustavo Ambrozio发布的答案(已删除)中可以找到文档,以防任何观众感兴趣。
iDev

Answers:


110

相同的规则是否适用于放置在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调度队列具有自己的自动释放池,但它们不保证这些池何时耗尽。如果您的应用程序受内存限制,则创建自己的自动释放池可让您以更规则的时间间隔释放自动释放对象的内存。


6
还不够清楚。已提交文档错误(<rdar:// problem / 8651175>)。
bbum 2010年

3
优秀的。感谢您的澄清。
布拉德·拉尔森

谁能提供链接与此苹果相关的文档?thankx
dennycd

1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.