我有以下类,它在其中一个方法中使用闭包:
class SomeClass {
let someOtherClassInstance: OtherClass
func performAsyncTask() {
DispatchQueue.global(qos: .background).async { [weak self] in
print("\(self?.someOtherClassInstance)")
}
}
}
我想知道我是否也可以将performAsyncTask
重写为:
func performAsyncTask() {
let instance = self.someOtherClassInstance
DispatchQueue.global(qos: .background).async {
print("\(instance)")
}
}
主要目标是我可以避免在捕获列表中使self
弱 - 或者更确切地说,我根本不必访问self
。在第二个版本中似乎没有引用self
,但是当我尝试访问instance
时可能会出现错误吗?
答案 0 :(得分:2)
那很好(假设self.someOtherClassInstance
没有
返回对SomeClass
实例的引用。你可以实现
与捕获列表相同:
func performAsyncTask() {
DispatchQueue.global(qos: .background).async {
[instance = self.someOtherClassInstance] in
print("\(instance)")
}
}
该闭包捕捉到了强烈的参考
OtherClass
实例,在执行之前一直持有,
但没有提及self
。
请注意,无论是否,闭包都会访问instance
SomeClass
实例仍然存在或不存在,因此行为是
与你的第一种方法略有不同。