微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐