首页 > 解决方案 > ARC 保留周期、大中央调度和关闭

问题描述

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

var someClosure : () -> Void?
let someConstant : Int = 5

并通过引用 self 从其类的 init 中调用该闭包:

someClosure = { print(self.someConstant) }

那么这将导致一个保留周期,所以我应该使用弱来避免它。

但我无法理解来自raywenderlich.com 教程的以下代码:

DispatchQueue.global(qos: .userInitiated).async { [weak self] in
      guard let self = self else {
        return
      }
      self.someFunction()

}

为什么这里存在保留循环——因为我们没有创建从视图到闭包的引用(即,将闭包保存为属性),而只是从闭包到自身;它不应该保持无循环吗?

标签: iosswift

解决方案


你是对的,雷是错的:

Grand Central Dispatch 关闭不会导致保留周期。

你可以删除

[weak self] in

guard let self = self else {
    return
}  

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


推荐阅读