Demystify SwiftUI - Lifetime
Lifetime(수명)은 SwiftUI가 뷰와 데이터의 존재에 대해 추적하는 방법으로, 뷰의 identity(정체성)가 유지되는 기간을 의미입니다. 하지만 여기서의 뷰의 수명은 struct의 자체의 수명이 아닙니다.
View value와 Identity의 차이
영상에서는 고양이에 비유하여 View의 Value와 Identity에 대해 설명합니다.
- 뷰의 값 (Value) - "고양이의 순간적인 사진"
- body 프로퍼티가 실행될 때마다 생성되는 struct 인스턴스입니다.
- 이것은 "졸고 있는 테세우스", "놀고 있는 테세우스"처럼 순간을 포착한 사진과 같습니다.
- SwiftUI는 이 '사진'을 이전 '사진'과 비교하여 변경 사항이 있는지 확인한 다음, 바로 버립니다. 즉, 매우 짧게 존재했다가 사라지는 일회성 값입니다.
- 뷰의 정체성 (Identity) - "테세우스라는 고양이 그 자체"
- 수많은 '사진'(값)들이 찍혀도, 그 사진들이 모두 '테세우스'라는 하나의 존재를 나타낸다는 개념입니다.
- SwiftUI가 화면에서 특정 '자리'나 '역할'에 부여하는 지속적인 개념입니다.
- 이 정체성이 바로 수명(Lifetime)을 가집니다. '테세우스'가 우리와 함께하는 기간이 그의 '수명'인 것처럼요.
State의 생명주기
그렇다면 뷰의 '수명'이 왜 그렇게 중요할까요? 바로 @State와 @StateObject 같은 상태(State) 데이터의 생명 주기를 결정하기 때문입니다.
@State 변수는 뷰의 '값'(struct) 안에 저장되지 않습니다. 대신, SwiftUI가 별도의 메모리에 보관하며, 이것을 뷰의 '정체성'과 연결해 둡니다.
- 탄생 (Birth)
- 뷰가 화면에 처음 나타나면, SwiftUI는 그 뷰에 고유한 정체성을 부여합니다.
- 동시에, 해당 뷰가 가진 @State 변수를 위한 메모리 공간을 단 한 번 할당하고 초기값을 저장합니다. 이것이 상태의 '탄생'입니다.
- 유지 (Persistence)
- 뷰의 body가 수백 번 다시 실행되어 수백 개의 새로운 '값'(struct)이 생성되고 버려져도, 뷰의 정체성이 동일하게 유지되는 한, SwiftUI는 처음에 할당했던 @State의 메모리 공간을 계속 유지하고 보존합니다. 뷰의 상태가 업데이트되면 이 메모리의 값이 바뀔 뿐입니다.
- 소멸 (Death)
- if-else 문에서 조건이 바뀌거나, 내비게이션에서 화면이 사라지는 등, 뷰가 더 이상 화면에 필요 없게 되면 뷰의 정체성이 파괴됩니다.
- 이때, 그 정체성에 묶여 있던 @State의 메모리 공간도 함께 파괴(해제)됩니다. 저장되어 있던 모든 값은 영원히 사라집니다.
해당 코드는 둘 다 CatRecorder()이지만 구조적 정체성(Structural Identity) 규칙에 따라 서로 완전히 다른 뷰로 간주되기 때문에 각각 정체성을 가집니다. 따라서 각각의 분기에 따라 특정 뷰들이 파괴되고 이에 따라 State 또한 파괴되어 초기화됩니다.
결론 및 핵심 정리
위 내용을 정리하자면 Identity가 Lifetime을 결정하고, Lifetime은 State와 연관 되어있기 때문에, 적절한 identity를 고려하여 코드를 구현해야 합니다.
뷰의 값(View Value)은 일시적인 것이기 때문에 정체성에 의존해야 합니다. 개발자는 정체성을 제어할 수 있기 때문에 정체성을 통해 상태의 생명주기를 명확하게 정의할 수 있습니다.
또한 SwiftUI는 데이터 기반 컴포넌트를 위해 Identifiable 프로토콜을 최대한 활용하므로, 데이터에 안정적인 식별자(stable identifier)를 선택하는 것이 중요합니다. 여기서 안정적인 식별자란 데이터 항목이 존재하는 동안 변하지 않는 고유의 값을 의미하는데, 만약 식별자가 불안정하다면(매번 바뀌는 랜덤값 등), SwiftUI는 데이터가 약간만 바뀌어도 모든 뷰를 파괴하고 새로 만들기 때문에 성능 저하를 유발할 수 있습니다.
'iOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] WWDC2021 - Demystify SwiftUI - Dependency (0) | 2025.09.17 |
---|---|
[SwiftUI] Source of Truth (0) | 2025.08.30 |
[SwiftUI] WWDC2021 - Demystify SwiftUI - Identity (0) | 2025.07.26 |
[SwiftUI] View Protocol과 ViewBuilder (0) | 2025.04.17 |
[SwiftUI] SwiftUI란 (0) | 2025.04.17 |