![](/img/trans.png)
[英]Do I still need to wrap Published Property wrapper object update with DispatchQueue.main.async
[英]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
。 请注意,此属性仅适用于.async()
。 如果执行.sync()
,则必须始终手动管理自动释放情况。
要回答您的问题:否。在主线程上,您不必使用autorelease{}
包装异步块。 对于任何其他队列,您都需要设置属性或手动包装在autorelease{}
。
如果可能会自动释放某些东西,我建议不要直接DispatchQueue.global
到DispatchQueue.global
,因为这可能会泄漏或最终导致一个永不清空的池。 而是使用明确的自动释放池策略创建自己的队列。
您不会使用GCD( dispatch
功能家族)创建新线程。 这些是已经存在的系统队列,您不需要其他的自动释放池。
如果您要在Swift中手动使用NSThread
或Thread
,那么您将不必担心,但是通常您甚至不需要相对高级的后台处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.