2

在 Swift 中,我目前面临的问题是,在将类的函数作为闭包参数传​​递时,我需要经常换行以防止强引用循环functionsclosures例如,在下面的场景中:

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

4

0 回答 0