【发布时间】:2017-04-15 03:42:59
【问题描述】:
class Name {
var name: String
init(name: String) {
self.name = name
}
deinit {
print("\(name) deinit")
}
}
var x: Name? = Name(name: "abc")
var someClosure = {
print("\(x?.name)")
}
someClosure()
x = nil
然后控制台会输出:
Optional("abc")
abc deinit
可以看出调用了“deinit”函数。所以不会形成强参考循环。 但是如果我在闭包中添加一个捕获列表:
var someClosure = { [x] in
print("\(x?.name)")
}
控制台会输出:
Optional("abc")
并且没有调用“deinit”函数。所以对象和引用形成了一个强引用循环。
是什么原因?这两个条件有什么区别?
【问题讨论】:
标签: swift closures reference-cycle