加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 闭包的强引用周期?

发布时间:2020-12-14 05:31:58 所属栏目:百科 来源:网络整理
导读:Swift Closure在引用self时会有一个强大的引用循环,如下例所示: class Test { var name = "Hello" func doSomething() { {() - Void in self.name = "otherName" }() }} 在前面的示例中,我创建了一个强大的引用循环,所以我必须修复它: class Test { var na
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函数都将受此问题的影响 – 显然情况并非如此.弱者和无主的自我发挥作用的地方是匿名函数 – 正如我之前所说的那样,只有匿名函数本身也被自己保留.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读