【发布时间】:2016-12-05 16:12:15
【问题描述】:
我正在使用 Xcode Playground 测试快速关闭。
这是我的代码:
import UIKit
class A{
var closure: ()->() = {}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a = nil
正如预期的那样,a 是由闭包自包含的,所以 a 永远不会被释放。
但是,当我在最后一行之前添加这一行时:
a?.closure = { a?.name = "ttt" }
然后,我在输出窗口中发现“A is deinit”,这意味着a被释放了。 为什么?是不回收参考吗?
为了测试,我使用了一个函数来设置闭包,代码是版本2:
import UIKit
class A{
var closure: ()->() = {}
func funcToSetClosure(){
self.closure = { self.name = "BBB"}
}
var name: String = "A"
init() {
self.closure = {
self.name = self.name + " Plus"
}
}
deinit {
print(name + " is deinit")
}
}
var a: A?
a = A()
a?.funcToSetClosure()
a = nil
同样,a 永远不会被释放。
所以我得出结论,当闭包被init或类中的函数设置时,会引起循环引用,当它在类中设置时,不会引起循环引用。我说的对吗?
【问题讨论】:
标签: swift closures automatic-ref-counting