繁体   English   中英

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

[英]Do I need an autoreleasepool block inside a DispatchQueue.main.async

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

我知道在新线程上分派一些处理时需要一个autoreleasepool块。 但是在主线程上分派时是否需要?

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

    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

.never的文档截图

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

dispatch_sync的docu屏幕截图

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

如果可能会自动释放某些东西,我建议不要直接DispatchQueue.globalDispatchQueue.global ,因为这可能会泄漏或最终导致一个永不清空的池。 而是使用明确的自动释放池策略创建自己的队列。

您不会使用GCD( dispatch功能家族)创建新线程。 这些是已经存在的系统队列,您不需要其他的自动释放池。

如果您要在Swift中手动使用NSThreadThread ,那么您将不必担心,但是通常您甚至不需要相对高级的后台处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM