세상을 더 편리하게
article thumbnail
728x90

2023.01.12 - [Swift & iOS/SwiftUI] - [SwiftUI] Who is retaining @StateObject and ObservedObject

 

[SwiftUI] Who is retaining @StateObject and ObservedObject

면접관) @StateObject와 @ObservedObject로 문제를 해결해셨다는데 어디서 retain하고 있죠? 나) ... 잘 모르겠습니다. ObservedObejct의 Retain(소유)은 누구일까? 간단하게 위에 처럼 작성하였다. StateView는 @StateO

slowsure.tistory.com

이전 글에서 누가 Retain하고 있냐에 대해서 알아보았다.

이제 특성의 차이를 알아보고자 한다.

사실 StateObjectObservedObject는 비슷해 보인다.

하지만 StateObject의 특징을 기억하면 차이점을 알 수 있을 것이다.

StateObject의 특성

StateObject를 통해 관찰되고 있는 객체는 화면이 재생성되어도 파괴되지 않는다.

 

다음의 예제를 통해서 자세하게 살펴보자

import SwiftUI

struct RandomNumberView: View {
    @State var randomNumber = 0

    var body: some View {
        VStack {
            Text("Random number is: \(randomNumber)")
            Button("Randomize number") {
                randomNumber = (0..<1000).randomElement()!
            }
        }
            .padding()

        ObservedView()
            .padding()
        
        StateView()
            .padding()
    }
}

struct ObservedView: View {
    @ObservedObject var viewModel = ViewModel()

    var body: some View {
        VStack {
            Text("ObservedObject Count is: \(viewModel.count)")
            Button("Increment") {
                viewModel.count += 1
            }
        }
    }
}



final class ViewModel: ObservableObject {
    @Published var count = 0
}


struct StateView: View {
    @StateObject var viewModel = ViewModel()

    var body: some View {
        VStack {
            Text("StateObject Count is: \(viewModel.count)")
            Button("Increment") {
                viewModel.count += 1
            }
        }
    }
}

ObservedObject의 Count는 초기화가 진행되는데 반해,

StateObject의 Count는 초기화가 되지 않음을 볼 수 있다.

이유는 StateObject의 특성 때문이다!

Randomize number을 통해서 RandomNumberView가 재생성되면

하위 View인 ObservedView도 재생성된다. -> @ObservedObject ViewModel도 재생성된다.

BUT!!

StateView의 StateObejcet는 StateObject의 특성상 파괴되지 않는다!

<이미지가 안열린다면 링크>

https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app

A state object behaves like an observed object, except that SwiftUI knows to create and manage a single object instance for a given view instance, regardless of how many times it recreates the view. 

StateObjecㅅ는 마치 ObservedObject 처럼 행동합니다. 하지만 StaetObject는 SwiftUI가 단일 객체를 만들고 관리합니다.
주어진 View가 얼마나 재생성되는지 상관없이

StateObject로 선언되고 생성된 객체는 SwiftUI가 직접 관리하고 있음을 알 수 있다.

그럼 위의 예제에서 다음을 알 수 있다.

Randomsize number 버튼을 누르면 어떻게 작동하는가?

1. RandomNumberView가 재생성된다.

1. ObservedView 가 재생성된다. -> @ObservedObejcet로 선언된 viewModel이 재생성된다.

2. StateView가 재생성된다. -> @StateObject로 선언된 viewModel은 특성 때문에 재생성되지 않는다.

728x90
profile

세상을 더 편리하게

@쵱니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!