Programming/Swift
[SwiftUI] @StateObject 또는 @ObservedObject 차이점
알레아
2023. 4. 18. 14:40
반응형
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)
참고사이트
반응형