通过使用函数参数类型来避免弱引用?
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 ;但这里不会发生这种情况。
我有一个接受块作为参数的函数。我可以使用尾随闭包来传递代码块,但该闭包在保留 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 ;但这里不会发生这种情况。