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

时间:2018-01-22 13:06:09

标签: swift closures automatic-ref-counting

我有以下类,它在其中一个方法中使用闭包:

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时可能会出现错误吗?

1 个答案:

答案 0 :(得分:2)

那很好(假设self.someOtherClassInstance没有 返回对SomeClass实例的引用。你可以实现 与捕获列表相同:

func performAsyncTask() {
    DispatchQueue.global(qos: .background).async {
        [instance = self.someOtherClassInstance] in
        print("\(instance)")
    }
}

该闭包捕捉到了强烈的参考 OtherClass实例,在执行之前一直持有, 但没有提及self

请注意,无论是否,闭包都会访问instance SomeClass实例仍然存在或不存在,因此行为是 与你的第一种方法略有不同。