在 Swift 中,“[self] in”和“[weak self] in”的区别是什么?

3
我刚刚发现,在闭包中可以写"[self]"而不是"[weak self]",但我不确定这样是否安全。
更多细节:
之前:
func roundShape(corners: CACornerMask, radius: CGFloat) {
        DispatchQueue.main.async { [weak self] in
            layer.cornerRadius = radius
            layer.maskedCorners = corners
        }
    }

现在:

 func roundShape(corners: CACornerMask, radius: CGFloat) {
      DispatchQueue.main.async { [self] in
           layer.cornerRadius = radius
           layer.maskedCorners = corners
      }
  }

如果您知道它们之间的区别,请告诉我。
2个回答

3

[self]的写法与将闭包保留为其原始状态相同,这意味着可能会导致保留循环,不像[weak self]。顺便说一下,使用DispatchQueue.main.async {时不需要任何一个,因为GCD队列不会对self保持强引用。


3

弱引用ARC的一个概念,主要用于避免保留环。如果直接使用self,则会创建一个强引用,并且不会从内存中删除。因此,持有变量的对象将保持活动状态,并导致内存泄漏。为了解决这个问题,必须使用弱引用,一旦工作完成就立即释放内存。

注意:弱引用是一个可选项,因此可以使用可选链来访问变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接