通常,如果您在NSOperationQueue上生成后台线程或运行NSOperation,则需要为该线程或操作创建一个NSAutoreleasePool,因为默认情况下不存在。
相同的规则是否适用于放置在中央分派队列中并将在非主线程上运行的块?也就是说,您是否需要在分派到主队列以外的任何其他块中创建一个NSAutoreleasePool?
在我有限的测试中,我没有看到自动释放对象的控制台警告,而你通常会在后台线程或NSOperations中看到。然而,我似乎找不到关于这方面的权威文档,所以我想知道是否有人可以指出这是在哪里陈述的。
发布于 2010-11-10 13:18:22
是否相同的规则适用于放置在中央分派队列中并将在非主线程上运行的块?也就是说,您是否需要在分派到主队列以外的任何其他块中创建一个NSAutoreleasePool?
大中央调度将自动管理每个队列的自动释放池。但是,不能保证何时会排空该池;它可能是在一个块被处理之后,也可能是在数百个块之后(但可能不会)。
所以,如果你只分配了几个对象,不用担心。但是,如果您正在分配大量的对象(由于您的目标是内存受限的环境),那么您应该创建并排空池。
文档已更新。
如果您的块创建了多个Objective-C对象,您可能希望将块的部分代码包含在@autorelease块中,以处理这些对象的内存管理。尽管GCD调度队列有自己的自动释放池,但它们不能保证何时会耗尽这些池。如果您的应用程序是内存受限的,创建自己的自动释放池允许您以更固定的时间间隔为自动释放的对象释放内存。
https://stackoverflow.com/questions/4141123
复制相似问题