swift – 闭包的强引用周期?

前端之家收集整理的这篇文章主要介绍了swift – 闭包的强引用周期?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Swift Closure在引用self时会有一个强大的引用循环,如下例所示:
class Test {
  var name = "Hello"

  func doSomething() {
    {() -> Void in 
      self.name = "otherName"
    }()
  }

}

在前面的示例中,我创建了一个强大的引用循环,所以我必须修复它:

class Test {
  var name = "Hello"

  func doSomething() {
    {[unowned self] () -> Void in 
      self.name = "otherName"
    }()
  }

}

问题:如果我在封闭中引用自我,我是否必须总是使用无主的自我,或者是否有必须使用弱自我的情况?

If I refer self in a closure do I have to use alway unowned self or are there cases where I have to use weak self?

都不是.在大多数情况下,只需正常引用自身,不做内存管理.如果存在保留周期的危险,您只需要担心内存管理,除非您将闭包存储在某个地方,例如self的属性,否则没有这样的危险.

您可以通过添加deinit实现轻松证明这一点:

class Test {
    var name = "Hello"

    func doSomething() {
        {() -> Void in
            self.name = "otherName"
            }()
    }
    deinit {
        println("bye")
    }
}

现在制作一个Test实例并立即释放它:

func testTest () {
    let t = Test()
}

您在控制台中看到“再见”,证明该实例已按良好顺序发布.这段代码中从来没有任何“强引用循环”.你的担忧毫无根据.

[顺便说一下,你使用“封闭”这个词错了.每个Swift函数都是一个闭包.如果仅仅因为在闭包中使用单词self而存在保留周期问题,则每个Swift函数都将受此问题的影响 – 显然情况并非如此.弱者和无主的自我发挥作用的地方是匿名函数 – 正如我之前所说的那样,只有匿名函数本身也被自己保留.

原文链接:https://www.f2er.com/swift/319494.html

猜你在找的Swift相关文章