gpt4 book ai didi

swift - 闭包的强引用循环?

转载 作者:IT王子 更新时间:2023-10-29 05:41:22 24 4
gpt4 key购买 nike

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"
}()
}

}

问题:如果我在闭包中引用 self,我是否必须始终使用 unowned self 还是在某些情况下我必须使用 weak self

最佳答案

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 而不对其内存管理进行任何操作。如果存在保留循环的危险,您只需要担心内存管理,除非您将闭包存储在某个地方,例如 self 的属性,否则不存在这种危险。

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

class Test {
var name = "Hello"

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

现在创建一个测试实例并立即释放它:

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

您在控制台中看到“再见”,证明该实例已顺利发布。这段代码中从来没有任何类型的“强引用循环”。你的担心是没有根据的。

[顺便说一下,你用错了“闭包”这个词。 每个 Swift 函数都是一个闭包。如果仅因为在闭包中使用 self 一词而出现保留周期问题,每个 Swift 函数都会遇到此问题——显然情况并非如此。 weakunowned self 发挥作用的地方是在 anonymous 函数中——正如我之前所说,只有当匿名函数是本身也由 self 保留。]

关于swift - 闭包的强引用循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30016463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com