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

72

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

同样的规则适用于放置在Grand Central Dispatch队列中并将在非主线程上运行的块吗?也就是说,除了主队列之外,您是否需要在每个分派的块内创建一个NSAutoreleasePool?

在我的有限测试中,我没有看到常规后台线程或NSOperations中会出现的自动释放对象的控制台警告。但是,我似乎找不到确定的文档,所以我想知道是否有人能指出这个规定在哪里说明。


从被删除的 @Gustavo Ambrozio 的回答中,文档在这里,如果有任何观众感兴趣的话。 - iDev
1个回答

111

同样的规则适用于在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调度队列有自己的自动释放池,但它们不保证何时会排空这些池。如果您的应用程序受到内存限制,创建自己的自动释放池可让您更定期地释放自动释放对象的内存。


6
不够清楚。已提交文档错误报告(rdar://problem/8651175)。 - bbum
有人能提供与此相关的苹果文档链接吗?谢谢。 - dennycd
1
@dennycd 请查找“autorelease”:https://developer.apple.com/library/ios/DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1 - bbum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接