Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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_Memory Management_Closures - Fatal编程技术网

Swift 闭包的强引用循环?

Swift 闭包的强引用循环?,swift,memory-management,closures,Swift,Memory Management,Closures,当Swift Closure引用self时,它将有一个很强的引用周期,例如: class Test { var name = "Hello" func doSomething() { {() -> Void in self.name = "otherName" }() } } 在上一个示例中,我创建了一个强引用循环,因此我必须使用以下方法修复它: class Test { var name = "Hello" func doSome

当Swift Closure引用self时,它将有一个很强的引用周期,例如:

class Test {
  var name = "Hello"

  func doSomething() {
    {() -> Void in 
      self.name = "otherName"
    }()
  }

}
在上一个示例中,我创建了一个强引用循环,因此我必须使用以下方法修复它:

class Test {
  var name = "Hello"

  func doSomething() {
    {[unowned self] () -> Void in 
      self.name = "otherName"
    }()
  }

} 
问题:如果我在闭包中引用self,我是否必须始终使用
无主self
,或者在某些情况下我必须使用
弱self

如果我在闭包中引用self,我是否必须始终使用无主self,或者在某些情况下我必须使用弱self

都不是。在大多数情况下,只需正常参考
self
,对其内存管理不做任何操作。如果存在保留周期的危险,您只需担心内存管理,除非您将闭包存储在某个地方,例如self属性,否则就不会有这种危险

您可以通过添加
deinit
实现轻松证明这一点:

class Test {
    var name = "Hello"

    func doSomething() {
        {() -> Void in
            self.name = "otherName"
            }()
    }
    deinit {
        println("bye")
    }
}
现在制作一个测试实例并立即发布:

func testTest () {
    let t = Test()
}
您可以在控制台中看到“再见”,证明该实例已按良好顺序释放。在这段代码中从来没有任何类型的“强引用循环”。你的担心是毫无根据的


[顺便说一句,你用的是“结束”错误。每个Swift函数都是一个闭包。如果仅仅因为在闭包中使用单词
self
而存在保留周期问题,那么每个Swift函数都会受到这个问题的影响-显然不是这样。弱
和无主
self发挥作用的地方是在匿名函数中-并且只有,正如我之前所说的,如果匿名函数本身也被
self
]

保留,在可能出现保留周期的情况下,关于
无主
之间的区别,请看我的书:你能给出一个什么时候使用它和什么时候不使用它的例子吗?请看我刚才给你的链接!特别是本节:闭包是非转义的(这意味着闭包不是异步的,或者没有延迟,因此它可以“停留在范围内”)。你不需要使用它们中的任何一个。看见有关需要在何处使用的示例,请参阅