我有一个接受块作为参数的函数。我可以使用尾随闭包来传递代码块,但是在保留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
}
}
答案 0 :(得分:3)
你的问题的整个前提("但是关闭必须使用弱引用")是错误的。在您的第一个代码中没有任何理由使用weak self
。这是完全合理的:
init() {
test.subscribe {
self.update()
}
}
需要使用weak self
的原因是引用self
的闭包本身由 self
保留,从而导致保留周期;但这不会发生在这里。