swift中的捕获列表self
我已经在swift上阅读了一篇关于GCD的教程 在第一部分中,作者写道:swift中的捕获列表self,swift,grand-central-dispatch,Swift,Grand Central Dispatch,我已经在swift上阅读了一篇关于GCD的教程 在第一部分中,作者写道: DispatchQueue.global(qos: .userInitiated).async { [weak self] in guard let self = self else { return } let overlayImage = self.faceOverlayImageFrom(self.image) // 2 DispatchQueue.main.async { [weak
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
guard let self = self else {
return
}
let overlayImage = self.faceOverlayImageFrom(self.image)
// 2
DispatchQueue.main.async { [weak self] in
// 3
self?.fadeInNewImage(overlayImage)
}
}
根据我读过苹果公司的swift文档后了解到的情况,我认为使用“unowned”关键字更好,因为self是一个viewcontroller,它的使用寿命比closure属性更长。我们也不需要打开可选的自我。你能解释一下这个案子的更多细节吗?谢谢 您不必担心与GCD的强链接
DispatchQueue.main.async {
DispatchQueue.global(qos: .userInitiated).async {
因此,省略任何
[weal self]
/[unowned self]
教程是错误的。在本例中,不需要捕获列表。谢谢现在一切都清楚了。虽然不需要它,但使用[弱自我]
并没有错,而且,依我看,总比不包括它好。(例如,如果在运行faceOverlayImageFrom
时关闭视图控制器,为什么要强制它在该方法完成之前不释放与视图控制器及其其他属性关联的内存?)但是使用[无主自]
肯定是错误的。不要将它用于异步调用。只有当您知道在本例中有问题的对象,self
在您到达闭包之前无法解除分配时,才使用unowned
,这里绝对不是这种情况。@Rob+1。我用“无主关键字”做了一个测试,结果崩溃了。此外,我如何知道viewcontroller是否已解除分配?我是swift新手,据我所知,swift只对类使用Denit(使用objective-c,我通常将日志放入dealloc func以确保我的所有类都被解除分配)。好了,视图控制器是一个类,所以继续添加一个带有打印语句的Denit
(或其他),就像您过去在ObjC中使用的dealloc
。在应用程序中执行此操作的典型方法是在闭包中使用[weak self]
,如果self
为nil
,则您知道视图控制器已解除分配。是的,因为这不是闭包存储的属性权限?self
不保留调度队列。main
singleton