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