Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 设置函数范围变量以避免使用捕获列表_Swift_Closures_Automatic Ref Counting - Fatal编程技术网

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:是的,完全正确,否则它将一直保持活动状态,直到闭包完成执行。