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”函数。所以对象和引用形成了一个强引用循环。
是什么原因?这两个条件有什么区别?