2014-06-10 133 views
3

的夫特编程语言导具有以下示例:对象不释放

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 

据预计在DEINIT()方法来打印出字符串,但它没有印刷任何东西。这对我来说意味着对象仍然存在,并且与关闭有很强的参照周期。有没有人得到同样的问题?

+0

这样做,如果这是在一个操场上,熊的操场环境似乎让阿霍德变量(大概是打印出来和其他调试。)尝试实际项目中的相同代码,并查看是否获得预期结果。 –

+0

谢谢。我在main.swift文件 – LongNV

回答

1

记住弱捕获,而不是无主

class HTMLElement { 

    let name: String 
    let text: String? 

    @lazy var asHTML:() -> String = { 
     [weak 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 
+0

上的一个真实项目上运行代码感谢它按预期工作。然而,我的问题是乳清它不适用于“无主”关键字,因为这个关键字基本上类似于弱,除了它不允许可选值。 – LongNV

+0

我的猜测是一个编译器bug,肯定值得提交 –

+0

@LongNV接受anwer,如果它是正确的,并且upvote它,如果它超出了你的期望。 – vrwim