我有两个班级,A班和B班。在类 A 中,我声明了一个可选闭包,在类 B 中,我调用该闭包。在类 B 中,您可以在 callTapA 函数中看到,我正在使用 [weak self] 调用闭包以安全地释放引用,但在 callTapB 函数中,我正在调用可选闭包并使用函数进行赋值。两者都是正确的,但是 [weak self] 是如何在 callTapB 中管理的?像这样使用闭包安全吗?
class A {
var onTapA: ((_ name: String) -> Void)?
init(onTapA: ((_ name: String) -> Void)? = nil) {
self.onTapA = onTapA
}
}
class B {
var newName:String = ""
let a:A
init(a: A) {
self.a = a
callTapA()
callTapB()
}
func callTapA() {
a.onTapA = { [weak self] name in
guard let self = self else { return }
newName = name
}
}
func callTapB() {
a.onTapA = onTapB
}
func onTapB(name: String) {
newName = name
}
}
这样使用闭包安全吗
不。 A和B实例互相保留;这是一个保留周期和内存泄漏。