设置函数范围变量以避免使用捕获列表

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 实例是否仍然存在,所以行为是 与您的第一种方法略有不同。