通过使用函数参数类型来避免弱引用?

Avoid weak references by using function parameter types?

我有一个接受块作为参数的函数。我可以使用尾随闭包来传递代码块,但该闭包在保留 self.

时必须使用 weak 引用

例如,见MyClass2的初始化器:

class MyClass {
    func subscribe(using block: @escaping () -> Void) {
        DispatchQueue.global().async {
            block()
        }
    }
}

let test = MyClass()

class MyClass2 {

    var someProperty = 0

    init() {
        // Weakly referenced
        test.subscribe { [weak self] in
            self?.update()
        }
    }

    func update() {
        self.someProperty += 1
    }
}

MyClass2()

但是,如果我像这样将闭包作为函数参数传递,还需要这样做吗?:

class MyClass2 {

    var someProperty = 0

    init() {
        // Avoid retain cycle?
        test.subscribe(using: update)
    }

    func update() {
        self.someProperty += 1
    }
}

您问题的整个前提 ("but that closure must use a weak reference") 都是错误的。从来没有任何理由在您的第一个代码中使用 weak self 。这将是完全合理的:

init() {
    test.subscribe {
        self.update()
    }
}

之所以需要使用weak self是因为引用self的闭包本身被byself保留了,造成了retain cycle ;但这里不会发生这种情况。