2014-06-10 2 views
3

스위프트 프로그래밍 언어 가이드는 다음과 같은 예를 가지고 : 그것은 deinit() 메소드에 문자열을 출력 할 것으로 예상했다객체가 해제되지

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 

를하지만, 인쇄하지 않은 아무것도. 객체가 아직 살아 있고 closure에 대한 참조주기가 강하다는 것을 의미합니다. 누구도 같은 문제가 있습니까? 이 놀이터에있는 경우 놀이터 환경 변수의 연락을 취하는 유지하는 것 같다

+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

감사합니다. 예상대로 작동했습니다. 그러나, 내 질문은 whey 그것은 "unowned"키워드와 함께 작동하지 않습니다, 원인이 키워드는 근본적으로 약점을 제외하고는 선택적 값을 허용하지 않는다는 것입니다. – LongNV

+0

내 생각 엔 컴파일러 버그 일 것입니다. –

+0

@LongNV는 올바른 경우 anwer를 수락하고 기대 이상의 경우 upvote합니다. – vrwim