在 Swift 中,我目前面临的问题是,在将类的函数作为闭包参数传递时,我需要经常换行以防止强引用循环functions
。closures
例如,在下面的场景中:
class A {
var foo: () -> Void
}
class B {
private let a: A
init() {
self.a = A()
a.foo = { [weak self] in self?.foo() } // <- Can this be simplified, while still avoiding strong reference cycles?
}
private func foo() {}
}
必须总是输入{ [weak self] in self?.myFunc() }
并不好,因为它打开了人们忘记包裹myFunc
在闭包中时意外引入内存泄漏的大门。是否有一种更简单/更简单的方法可以实现类似的行为?
- 编辑
如果没有更简单的方法,我可能会在@Apple 上打开一个功能请求,以获得类似于以下内容的语法:
init() {
self.a = A()
a.foo = weak foo
}
a.foo = weak foo
相当于_a.foo = { [weak self] in self?.foo() }
或者,在处理不属于 的函数时self
:
let b = B()
let a = A()
a.foo = weak b.foo
a.foo = weak b.foo
相当于_a.foo = { [weak b] in b?.foo() }
注意:我并不是建议让闭包本身具有弱可引用性。我只是提议它weak b.foo
的编译方式与{ [weak b] in b?.foo() }