[iOS] ObservedObject, 그는 신인가?

유인호·2024년 1월 25일
0

iOS

목록 보기
26/64

[알쓸신잡] iPad에서 똑같은 앱을 동시에 실행하고 있을때, 참조 메모리를 공유할까?의 2편임.


0. 전편 요약

  • 전제는 같은 앱을 아이패드에서 동시에 켰을때임.
  • StateObject, State는 같은 메모리주소를 가지지 않아서 데이터를 공유하지 않았음.
  • 그러나 ObservedObject는 같은 메모리 주소를 가지고 있어서 서로 데이터를 공유함.
  • 이 게시물을 작성하기 위해 실험을 더 해본 결과 알게된 사실은 싱글톤으로 만든 녀석도 데이터를 공유한다는 사실임. 이로 인해서 ObservedObject는 싱글톤 패턴과 어느정도는 유사하게 볼 수 있다는 가설을 내릴 수 있음.

1. StateObject vs ObservedObject

전편에서 알 수 있듯 StateObject는 메모리 주소가 서로 달랐고, ObservedObject는 메모리 주소가 같았다. 이는 분명히 같은 앱 이지만 다른 앱으로 취급한다는 사실을 부정할수는 없을것이다.

그렇다면, 생성 시점이 ObservedObject가 더 앞서서 그런것인가? 라는 생각을 하였지만, 아무리 생각해도 얼토당토 않는 이야기라서 잠시 넣어놓고 구글링을 해보았다. 그러던 중 이런 문구를 발견했다.
출처 : @ObservedObject model lifecycle?

TestModel이 TestParentView 생성되지 않고, 단지 전달되었다는 것이다. 그것은 TestParentView_Previews 만들어졌다. 그리고 TestParentView_Previews 본문은 한 번만 실행되기 때문에, TestModel도 한 번만 초기화되므로 할당되지 않습니다.

ObservedObject, 이름에도 볼 수 있듯 그저 관찰한다는 이야기이다. 마치, State와 Binding에서 Binding에 좀더 가깝다는 가설을 내릴 수 있다. 그래야 뷰의 생명주기를 같이할 수 있기 때문이다.


2. 그래서 내가 내린 결론은

StateObject와 ObservedObject의 차이는 누가 객체를 가질것인가? 이다.

@StateObject - 객체를 처음 생성하는 뷰는 @StateObject를 사용.

G선생님의 +a 설명
SwiftUI에게 해당 데이터의 소유주가 이 뷰이며, 이 뷰가 해당 데이터를 유지하고 살려두는 책임이 있다는 것을 알려줍니다.

@ObservedObject - 하위 뷰는 @ObservedObject를 사용.

G선생님의 +a 설명
이는 해당 뷰가 객체를 감시하고 변경사항을 받아들이는 역할만 한다는 것을 의미합니다. 즉, 데이터의 소유주는 다른 뷰이며, 이 뷰는 데이터를 직접 소유하거나 관리하지 않습니다.

ObservedObject를 사용했을때 메모리를 공유할 수 있던건, 관찰 대상의 객체의 데이터를 직접 소유하지 않았기 때문에 가능했다. 정도로 마무리 지을 수 있을듯.

+) 이렇게 저렇게 물어보다가 이게 제일 이해가 잘 되어서 가져와봤음.

  • @StateObject를 사용하는 뷰에서는 해당 객체를 처음 생성합니다.
    이렇게 하면 뷰의 라이프사이클 동안 해당 객체가 존재하며, 뷰와 해당 객체 간의 관계는 매우 강한 것으로 볼 수 있습니다.
    해당 객체가 소멸되려면 뷰의 라이프사이클이 끝나거나 @StateObject 속성에 새로운 객체를 할당해야 합니다.

  • @ObservedObject를 사용하는 뷰에서는 이미 다른 뷰나 뷰 모델에 의해 생성된 객체를 관찰합니다.
    이 경우 뷰는 해당 객체의 변경사항을 감지하고 뷰를 업데이트할 수 있습니다.
    객체의 수명 주기는 @ObservedObject를 사용하는 뷰에 의존하며, 해당 객체가 소멸되면 뷰도 해당 객체를 더 이상 관찰하지 않게 됩니다.


자매품

iOS13에서 ObservedObject가 나오고, 이러한 문제들 때문에 추후에 StateObject가 나왔는데, 뷰에서 뷰로 뷰모델을 넘겨줄때, 맨앞에 StateObject로 생성한 뒤에 ObservedObject로 바인딩 하듯 사용하는것이 애플이 지향하는 프로그래밍이라고 한다.


레퍼런스

@StateObject vs @ObservedObject 차이점
@ObservedObject model lifecycle?


다음편 : [iOS] ObservableObject에게 데이터를 묻다

profile
🍎Apple Developer Academy @ POSTECH 2nd, 🌱SeSAC iOS 4th

0개의 댓글