Swift 设置函数范围变量以避免使用捕获列表
我有一个类,它在一个方法中使用闭包:Swift 设置函数范围变量以避免使用捕获列表,swift,closures,automatic-ref-counting,Swift,Closures,Automatic Ref Counting,我有一个类,它在一个方法中使用闭包: class SomeClass { let someOtherClassInstance: OtherClass func performAsyncTask() { DispatchQueue.global(qos: .background).async { [weak self] in print("\(self?.someOtherClassInstance)") }
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
,但是当我尝试访问实例时是否有可能出现错误?这很好(假设self.someOtherClassInstance
没有
返回对SomeClass
实例的引用)。你可以实现
与捕获列表相同:
func performAsyncTask() {
DispatchQueue.global(qos: .background).async {
[instance = self.someOtherClassInstance] in
print("\(instance)")
}
}
闭包捕获了对
OtherClass
实例,该实例一直保持到执行完毕,
但没有提及自我
请注意,闭包访问实例
,而不管是否
SomeClass
实例是否仍然存在,因此行为是
与第一个方法略有不同。如果SomeClass
实例被释放,并且应用程序中没有其他对象持有对someOtherClassInstance的引用,会发生什么情况?除非捕获列表被指定为类似于[weak instance=self.someOtherClassInstance]
?@peco:是的,完全正确,否则它将一直保持活动状态,直到闭包完成执行。