Ker*_*dex 5 multithreading ios swift
在 Xcode 8.2.1 中为 iOS 应用程序使用 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
Run Code Online (Sandbox Code Playgroud)
DispatchQueue 有一个“自动释放频率”属性,它决定每个工作项是否被自动包围autorelease{}。它记录在dispatch/queue.h而不是在 Apple 的文档中,所以我无法链接到它;附上标题中的屏幕截图。
DispatchQueue.main有自动释放频率.workitem(这意味着自动释放每个 dispatch_async)DispatchQueue.global将其设置为.never(从不自动释放;这取决于您)DispatchQueue.init创建一组到.inherit. 默认情况下,新队列以全局队列为目标,这意味着它是隐式的.never。请注意,此属性仅适用于.async(). 如果这样做.sync(),您必须始终手动管理自动释放情况。
回答你的问题:不。在主线程上,你不必用autorelease{}. 对于任何其他队列,您需要设置属性或手动换行autorelease{}.
我建议永远不要直接分派,DispatchQueue.global如果有一些东西会被自动释放的风险,因为这会泄漏或最终进入一个从未清空的池。相反,使用显式自动释放池策略创建您自己的队列。