Closure retain cycle
class HTMLElement {
let name: String
let text: String
// 參考self的closure造成 記憶體無法釋放的retain cycle
lazy var asHTML: () -> String = {
return "<\(self.name)>\(self.text)</\(self.name)>"
}
init(name: String, text: String) {
self.name = name
self.text = text
}
deinit {
print("HTMLElement \(name) is bring deallocated")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "some smaple paragraph body text")
paragraph?.asHTML()
paragraph = nil // 因為retain cycle 而無法釋放所以不會執行 deinit