[알쓸신잡] iPad에서 똑같은 앱을 동시에 실행하고 있을때, 참조 메모리를 공유할까?의 2편임.
전편에서 알 수 있듯 StateObject는 메모리 주소가 서로 달랐고, ObservedObject는 메모리 주소가 같았다. 이는 분명히 같은 앱 이지만 다른 앱으로 취급한다는 사실을 부정할수는 없을것이다.
그렇다면, 생성 시점이 ObservedObject가 더 앞서서 그런것인가? 라는 생각을 하였지만, 아무리 생각해도 얼토당토 않는 이야기라서 잠시 넣어놓고 구글링을 해보았다. 그러던 중 이런 문구를 발견했다.
출처 : @ObservedObject model lifecycle?
TestModel이 TestParentView 생성되지 않고, 단지 전달되었다는 것이다. 그것은 TestParentView_Previews 만들어졌다. 그리고 TestParentView_Previews 본문은 한 번만 실행되기 때문에, TestModel도 한 번만 초기화되므로 할당되지 않습니다.
ObservedObject, 이름에도 볼 수 있듯 그저 관찰한다는 이야기이다. 마치, State와 Binding에서 Binding에 좀더 가깝다는 가설을 내릴 수 있다. 그래야 뷰의 생명주기를 같이할 수 있기 때문이다.
StateObject와 ObservedObject의 차이는 누가 객체를 가질것인가? 이다.
G선생님의 +a 설명
SwiftUI에게 해당 데이터의 소유주가 이 뷰이며, 이 뷰가 해당 데이터를 유지하고 살려두는 책임이 있다는 것을 알려줍니다.
G선생님의 +a 설명
이는 해당 뷰가 객체를 감시하고 변경사항을 받아들이는 역할만 한다는 것을 의미합니다. 즉, 데이터의 소유주는 다른 뷰이며, 이 뷰는 데이터를 직접 소유하거나 관리하지 않습니다.
ObservedObject를 사용했을때 메모리를 공유할 수 있던건, 관찰 대상의 객체의 데이터를 직접 소유하지 않았기 때문에 가능했다. 정도로 마무리 지을 수 있을듯.
+) 이렇게 저렇게 물어보다가 이게 제일 이해가 잘 되어서 가져와봤음.
@StateObject를 사용하는 뷰에서는 해당 객체를 처음 생성합니다.
이렇게 하면 뷰의 라이프사이클 동안 해당 객체가 존재하며, 뷰와 해당 객체 간의 관계는 매우 강한 것으로 볼 수 있습니다.
해당 객체가 소멸되려면 뷰의 라이프사이클이 끝나거나 @StateObject 속성에 새로운 객체를 할당해야 합니다.
@ObservedObject를 사용하는 뷰에서는 이미 다른 뷰나 뷰 모델에 의해 생성된 객체를 관찰합니다.
이 경우 뷰는 해당 객체의 변경사항을 감지하고 뷰를 업데이트할 수 있습니다.
객체의 수명 주기는 @ObservedObject를 사용하는 뷰에 의존하며, 해당 객체가 소멸되면 뷰도 해당 객체를 더 이상 관찰하지 않게 됩니다.
iOS13에서 ObservedObject가 나오고, 이러한 문제들 때문에 추후에 StateObject가 나왔는데, 뷰에서 뷰로 뷰모델을 넘겨줄때, 맨앞에 StateObject로 생성한 뒤에 ObservedObject로 바인딩 하듯 사용하는것이 애플이 지향하는 프로그래밍이라고 한다.
@StateObject vs @ObservedObject 차이점
@ObservedObject model lifecycle?