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函数都将受此问题的影响 – 显然情况并非如此.弱者和无主的自我发挥作用的地方是匿名函数 – 正如我之前所说的那样,只有匿名函数本身也被自己保留.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...