了解何时在Swift中使用捕获列表

时间:2015-04-12 03:00:00

标签: ios macos swift

在Swift Book中,它表示当闭包作为属性保存在对象中时,闭包需要一个捕获列表。 (在Playground中使用Swift 1.2)。

  

如果为a分配闭包,也可以发生强引用循环   类实例的属性,以及该闭包的主体捕获   实例。这种捕获可能发生,因为闭合的身体   访问实例的属性,例如self.someProperty或   因为闭包调用实例上的方法,例如   self.someMethod()。在任何一种情况下,这些访问都会导致闭包   “捕捉”自我,创造一个强大的参考周期。

     

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

但是在这段代码中,我没有将闭包存储在对象中。然而,似乎我需要把[无主的自我]否则从来没有被称为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

0 个答案:

没有答案