【发布时间】:2016-02-21 03:39:21
【问题描述】:
class HTMLElement {
let name : String
let text: String?
//Declaring a lazy variable that has a strong reference to this closure
lazy var asHTML: Void -> String = {
//Optional binding here
if let text = self.text {
return "<\(self.name)>\(text)<\(self.name)>"
} else {
return "<\(self.name) >"
}
}
init(name: String, text: String? = nil){
self.name = name
self.text = text
}
deinit {
print("\(name) is being deinitialized")
}
}
我的问题是:为什么闭包声明为 Lazy,我知道这与 self 在闭包中不为人所知有关,但对于 init 方法的情况不一样,self还没创建?
其次,这个代码示例中的强引用循环究竟在哪里,是self强引用了asHTML,如果是,那么导致循环的强引用的第二部分在哪里?
第三,当常量不能改变值(从nil到一个值再回到nil)时,为什么常量text属性是可选的?
最后,当init方法用于接受用户发送的参数时,init方法中有参数text: String? = nil是什么意思?
对不起,这个长长的问题,我只是对闭包强引用循环感到困惑......虽然我确实理解类属性和类实例之间的强引用循环。
【问题讨论】:
标签: swift reference closures automatic-ref-counting strong-references