[WWDC] Demystify SwiftUI — Lifetime

WWDC2021 Demystify SwiftUI 중 Lifetime 정리글

SwiftUI 는 우리의 코드에서 아래의 세가지 요소를 확인합니다

이 세 가지 개념을 통해 SwiftUI는 변경해야 할 사항(what), 변경 방법(how), 변경 시기(when)를 결정할 수 있습니다.

오늘은 이전 시간에 살펴본 view의 identity가 어떤식으로 view와 data (state) 의 수명에 관련되어있는지 살펴보겠습니다.

View value != View identity

만약 ‘테세우스’ (identity) 라는 고양이가 있다고 해봅시다. 시간에 따라 테세우스의 기분 상태 (state) 는 변할 수 있겠지만, 어쨌든 항상 ‘테세우스’라는 같은 고양이인 것에는 변함이 없습니다.

view의 identity와 lifetime 도 동일한 방식으로 생할 수 있습니다. 즉, 테세우스(고양이)가 시간에 따라 다른 기분일 수 있듯이, 우리의 view도 lifetime 동안 다른 state 값을 가질 수 있습니다. 하지만 기분에 따라 테세우스의 본질이 변하지 않았듯이, view도 동일한 identity를 갖는 이상 view value에 상관없이 동일한 view 로 인식됩니다.

A view’s lifetime is the duration of the identity

view가 처음 생성(created)되고 나타날(appear) 때, SwiftUI는 이전 시간에 설명한 기술 (Explicit or Structural) 들을 통해 view에 identity 를 할당합니다.

시간이 지나면서 view 에 새로운 값(value)들이 생성될 수 있지만 (state 값이 변경되는 것), SwiftUI 관점에서는 여전히 동일한 view 입니다(같은 identity를 가지기 때문).

view의 수명이 종료될 때는 identity가 변경되거나, view가 제거(removed)될 때입니다. 따라서 view 의 수명identity의 지속 시간과 연관됩니다.

State lifetime = View lifetime

view identity 와 view lifetime 을 연결지어 생각할 수 있어야 비로소 SwiftUI가 어떻게 상태(state)를 유지하는지를 이해할 수 있습니다.

SwiftUI는 view에서 StateStateObject를 확인하면, 해당 데이터를 뷰의 lifetime 동안 유지해야 한다는 것을 인식합니다. 즉, StateStateObject는 view의 identiy와 연결된 영구적인 저장소(persistent storage)입니다.

view가 처음으로 만들어질때, SwiftUI는 StateStateObject초기 값을 사용하여 메모리에 스토리지를 할당합니다.

아래 그림에서는 title State에 초점을 맞추고 있습니다. SwiftUI는 storage가 변경(mutated)되어 view의 body가 재계산 (re-evaluated) 될 때에도, 뷰의 lifetime에 걸쳐 계속 해당 storage를 유지(persist) 합니다.

하지만 만약 identity 가 변경되는 방식으로 새로운 뷰가 생성된다면, 기존 view에 대한 storage는 deallocated 되고, state의 초기 값에서 다시 새로운 storage를 만듭니다.

identity 가 변경될 때마다 state 도 교체(replaced)되고, identity는 view의 lifetime과 연관되기 때문에, state의 영속성(persistence)은 view의 lifetime과 관련이 있다고 할 수 있습니다 (삼단논법 🧔🏼?!).

따라서 적절한 identity 값 (identifier) 을 사용해야, view와 data의 수명(lifetime)을 올바르게 제어할 수 있습니다.

마무리

이렇게 SwiftUI가 확인하는 세가지 요소 (Identity, Lifetime, Dependency) 중 두번째 Lifetime 에 대해 살펴보았습니다.

나머지 하나는.. 과연.. 쓰게 될까요..? 쓰게 된다면 밑에 링크를 추가하겠습니다.

이전 글

다음 글

출처

 https://github.com/sujinnaljin/TIL