在Swift Book中,它表示当闭包作为属性保存在对象中时,闭包需要一个捕获列表。 (在Playground中使用Swift 1.2)。
如果为a分配闭包,也可以发生强引用循环 类实例的属性,以及该闭包的主体捕获 实例。这种捕获可能发生,因为闭合的身体 访问实例的属性,例如self.someProperty或 因为闭包调用实例上的方法,例如 self.someMethod()。在任何一种情况下,这些访问都会导致闭包 “捕捉”自我,创造一个强大的参考周期。
但是在这段代码中,我没有将闭包存储在对象中。然而,似乎我需要把[无主的自我]否则从来没有被称为deinit。
class NamedObject {
var name: String
init(name: String) {
self.name = name
}
func update() {
dispatch_async(dispatch_get_main_queue()) { // [unowned self] in // capture list...uncomment to get deinit to call.
self.name = "foo"
}
}
deinit {
println("\(name) is being deinitialized")
}
}
var hello : NamedObject? = NamedObject(name: "hello")
hello?.name
hello?.update()
hello = nil // force release.
这意味着我需要在程序中将捕获列表添加到虚拟闭包中,因为我几乎总是引用self。我想在做出这样的改变之前确保我有这个权利。似乎如果那确实是必要的,那么他们就会使用一个比我更简单的例子。
请注意,这与此问题不同:Swift Closures - Capturing self as weak
这也与这个问题不同,即使原因是相同的,我的问题是关于块所有权,而这个问题是关于deinit永远不会被称为,它们与标记的不完全相同: Deinit method is never called - Swift playground