在iOS应用程序的Xcode 8.2.1中使用swift 3。

我了解在新线程上分派(dispatch)一些处理时需要一个autoreleasepool块。但是在主线程上分派(dispatch)时是否需要?

假设我们在主线程上并执行以下操作:

    DispatchQueue.global(qos: .background).async {
        autoreleasepool {
            //***** do something in the background
        } // autoreleasepool

        DispatchQueue.main.async {
            //***** do something on the main thread when background job is done
            //***** does this something need to be enclosed in an autoreleasepool block ?
        } // DispatchQueue.main.async

    } // DispatchQueue.global

最佳答案

DispatchQueue具有“自动释放频率”属性,该属性确定每个工作项是否自动被autorelease{}包围。它记录在dispatch/queue.h中,而不是在Apple文档中,因此我无法链接到它。附加标题的屏幕截图。

  • DispatchQueue.main具有自动释放频率.workitem(这意味着自动释放每个dispatch_async)
  • DispatchQueue.global将其设置为.never(永远不会自动释放;由您决定)
  • DispatchQueue.init创建一组.inherit。默认情况下,新队列以全局队列为目标,这意味着它是隐式.never

  • ios - 我是否需要DispatchQueue.main.async中的autoreleasepool块-LMLPHP

    请注意,此属性仅适用于.async()。如果执行.sync(),则必须始终手动管理自动发布情况。

    ios - 我是否需要DispatchQueue.main.async中的autoreleasepool块-LMLPHP

    要回答您的问题:否。在主线程上,您不必使用autorelease{}包装异步块。对于任何其他队列,您要么需要设置属性,要么手动将其包装在autorelease{}中。

    我建议不要在有可能会自动释放某些内容的风险的情况下直接调度到DispatchQueue.global,因为这可能会泄漏或最终导致一个永不清空的池。而是使用明确的自动释放池策略创建自己的队列。

    10-08 16:21