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

时间:2017-04-26 04:00:13

标签: swift memory-leaks automatic-ref-counting retain-cycle

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

例如,请参阅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
    }
}

1 个答案:

答案 0 :(得分:3)

你的问题的整个前提("但是关闭必须使用弱引用")是错误的。在您的第一个代码中没有任何理由使用weak self。这是完全合理的:

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

需要使用weak self的原因是引用self的闭包本身由 self保留,从而导致保留周期;但这不会发生在这里。