self
에 접근하는 것은 클로저의 실행이 끝나기까지 self를 소유하게 된다.lazy
키워드를 사용하면 지연 저장 속성이 된다.클로저 또한 강한 참조 사이클을 발생시킬 수 있다.
weak
혹은 unowned
를 사용하면 되엇으나, 클로저가 저장된 속성에는 weak를 적용할 수 없다.{ [list] (parameters) -> ReturnType in
statements
}
{ [list] in
statements
}
//클로저 캡처 리스트를 사용한다면, 이를 클로저 바디와 구분해야 하기 때문에 in을 생략해서는 안된다.
원래대로라면 클로저에서 캡처한 경우 원본을 캡처한다.
그러나, 값 형식을 클로저 캡처 리스트에 추가하면 원본 대신에 복사본을 캡처한다.
{ [weak instanceName, unowned instanceName] in
statements
}
여기서는 weak, unowned 어느것을 사용해도 상관 없다.
왜냐하면 클로저의 생명주기 때문이다.
viewDidLoad()
가 호출되는 시점에서 만들어짐보통 클로저를 사용할 때는 강한 참조가 발생하는지 바로 확인하기 힘드므로, 왠만하면 클로저 사용 시 클로저 캡처 리스트를 사용하는 것이 옳다.
또한 weak을 사용할지, unowned를 사용할지 에서 대상과 클로저의 생명주기의 길이를 꼭 비교하고 선택하자. (클로저의 생명주기 > 대상의 생명주기 일 경우 nil이나 crash)