ARC保留周期,大中央分派和关闭

时间:2019-06-25 19:03:00

标签: ios swift

我了解,如果您将闭包分配给以下属性:

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()

}

为什么这里存在一个保留周期-因为我们没有创建从视图到闭包的引用(即,将闭包保存为属性),而仅创建了从闭包到自身的引用;它应该保持无周期运行吗?

1 个答案:

答案 0 :(得分:1)

您是对的,而雷是错的:

大型中央分派处理关闭不会导致保留周期。

您可以删除

[weak self] in

guard let self = self else {
    return
}  

另请参阅https://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/