我了解,如果您将闭包分配给以下属性:
var someClosure : () -> Void?
let someConstant : Int = 5
然后从类的init中调用该闭包,并引用self:
someClosure = { print(self.someConstant) }
这将导致一个保留周期,所以我应该使用弱函数来避免它。
但是我无法理解来自raywenderlich.com tutorial的以下代码:
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
guard let self = self else {
return
}
self.someFunction()
}
为什么这里存在一个保留周期-因为我们没有创建从视图到闭包的引用(即,将闭包保存为属性),而仅创建了从闭包到自身的引用;它应该保持无周期运行吗?
答案 0 :(得分:1)
您是对的,而雷是错的:
大型中央分派处理关闭不会导致保留周期。
您可以删除
[weak self] in
guard let self = self else {
return
}
另请参阅https://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/