我最近开始分析我用 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/