본문 바로가기

Programming/Swift

[SwiftUI] @StateObject 또는 @ObservedObject 차이점

반응형

SwiftUI에서 MVVM형태의 코드를 작성하려고 할때 아래와 같은 방식으로 대부분 사용할텐데요

class TestViewModel: ObservableObject {
    @Published var name: String?
}

struct TestView: View {
    @ObservedObject var viewModel = TestViewModel()
    var body: some View {
        Text(viewModel.name)
    }
}

ViewModel의 Property Wrapper에는 아래와 같이 @StateObject 또는 @ObservedObject를 지정할 수 있습니다.

@StateObject var viewModel = TestViewModel()
@ObservedObject var viewModel = TestViewModel()

둘의 쓰임새가 비슷하여 사용 목적에 따라서 원하는 Property Wrapper를 사용해야합니다.

아래는 둘의 쓰임새가 다른 경우에 대한 설명입니다.

@StateObject와 @ObservedObject는 SwiftUI에서 ObservableObject 프로토콜을 준수하는 객체를 관찰하여 뷰를 업데이트하는 데 사용되는 속성 래퍼입니다. 그러나 둘의 차이점은 객체의 생명주기 관리 방식입니다.

@StateObject 속성 래퍼는 뷰의 생명주기에 따라 뷰 모델 인스턴스를 생성하고 관리합니다. 뷰가 다시 그려질 때마다 새로운 뷰 모델 인스턴스를 생성하지 않고 기존 인스턴스를 재사용하게 됩니다.

반면에 @ObservedObject 속성 래퍼는 뷰가 생성될 때마다 새로운 뷰 모델 인스턴스를 생성하고 뷰의 생명주기에 관계없이 해당 인스턴스를 계속해서 사용합니다. 이로 인해 뷰의 재생성이 많은 경우 불필요한 뷰 모델 인스턴스 생성과 메모리 사용이 발생할 수 있습니다.

따라서, 뷰 모델이 뷰의 생명주기와 독립적으로 존재하고 유지되어야 하는 경우에는 @StateObject 속성 래퍼를 사용하는 것이 적합하고, 뷰의 재생성이 많은 경우에는 @ObservedObject 속성 래퍼를 사용하는 것이 적합할 수 있습니다.

(from. ChatGPT)

 

참고사이트

https://wondev.tistory.com/5

반응형