gpt4 book ai didi

ios - 将参数传递给实例方法以避免保留循环?

转载 作者:搜寻专家 更新时间:2023-11-01 05:39:36 26 4
gpt4 key购买 nike

我最近开始分析我用 swift 编写的一个 iOS 应用程序,并意识到与其他更广泛采用的 GC(如 Mark-And-Sweep)相比,ARC 有多么烦人。

Strong Reference Cycle 的最普遍原因之一是在传递给另一个对象的闭包中保留实例属性,同样由类保留。

例如,

  class MyClass {
private let text = "hello world"
private let anotherClass = AnotherClass()
init() {
addText()
}
private func addText() {
anotherClass.addText { return self.text }
}
}

通过将参数传递给方法而不是直接访问 self 可以避免像上面那样的循环保留。

class MyClass {
private let text = "hello world"
private let anotherClass = AnotherClass()
init() {
addText(text)
}
private func addText(text:String) {
anotherClass.addText { return text }
}
}

第二种方法被认为是一种好的做法吗?

仅供引用,我知道可以使用捕获列表打破上面的保留周期。我只是对对内存泄漏更有弹性的模式感到好奇。

最佳答案

由于属性 let text ... 是一个常量,我认为第二种方法很好,可以被认为是最佳实践。

但是如果您对 var text ... 属性使用相同的方法,则行为会发生变化:

  • 在第一种方法中,闭包的执行将使用 text当前值,

  • 而在第二种方法中,闭包的执行将始终使用 text原始值。

关于ios - 将参数传递给实例方法以避免保留循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247205/

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