2014-06-10 180 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