swift 中由闭包引起的self强引用导致的内存溢出,必须使用unowned(无主引用)才能释放,weak(弱引用)也不可;
如下实例:必须在闭包asHTML中使用[unowned self] in 声明self,这样在最后释放时,才能成功释放掉paragraph对象。
class HTMLElement {
let name: String
let text: String?
lazy var asHTML: () -> String = {
[unowned self] in
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")
}
}
// 创建实例并打印信息
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
print(paragraph!.asHTML())
// HTMLElement实例将会被销毁,并能看到它的析构函数打印出的消息
paragraph = nil
输出打印:
<p>hello, world</p>
p is being deinitialized