设置函数范围变量以避免使用捕获列表
Setting function-scope variable to avoid using a capture list
我有以下 class,它在其中一个方法中使用闭包:
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
时会报错?
没关系(假设 self.someOtherClassInstance
没有
对 SomeClass
实例的反向引用)。你可以实现
与捕获列表相同:
func performAsyncTask() {
DispatchQueue.global(qos: .background).async {
[instance = self.someOtherClassInstance] in
print("\(instance)")
}
}
闭包捕获了对
OtherClass
实例,它被保留直到它被执行,
但没有提及 self
.
请注意闭包访问 instance
无论是否
SomeClass
实例是否仍然存在,所以行为是
与您的第一种方法略有不同。
我有以下 class,它在其中一个方法中使用闭包:
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
时会报错?
没关系(假设 self.someOtherClassInstance
没有
对 SomeClass
实例的反向引用)。你可以实现
与捕获列表相同:
func performAsyncTask() {
DispatchQueue.global(qos: .background).async {
[instance = self.someOtherClassInstance] in
print("\(instance)")
}
}
闭包捕获了对
OtherClass
实例,它被保留直到它被执行,
但没有提及 self
.
请注意闭包访问 instance
无论是否
SomeClass
实例是否仍然存在,所以行为是
与您的第一种方法略有不同。