Diferentes cierres que dan resultados diferentes para retener ciclos en forma rápida
Estoy leyendo la Guía del lenguaje de programación Swift de Apple. En la parte sobre Ciclo de referencia fuerte para cierres, probé un tipo diferente de cierre pero no dio el resultado esperado.
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 {
println("\(name) is being deinitialized")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
println(paragraph!.asHTML)
paragraph = nil
La salida de este código es:
<p>hello, world</p>
p is being deinitialized
"p se está desinicializando" se imprime incluso sin [yo propio]
El código en la guía es:
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 {
println("\(name) is being deinitialized")
}
}
var paragraph: HTMLElement? = HTMLElement(name: "p", text: "hello, world")
println(paragraph!.asHTML)
paragraph = nil
Esto imprime el mensaje del desinicializador solo cuando se agrega la declaración [self propio].
¿Cuál es la diferencia entre ambos cierres?