
우선, 이 라이프사이클을 정리하려는 것은 아니다
이미 너무 많이 봤고 조금만 검색해도 바로 나오기 때문에, 오늘은 다른 내용을 정리해보려 한다.
present된 VC를 dismiss하려다 말때 라이프 사이클은 어떻게 동작할까?(fullScreen은 말고...)
push된 VC가 pop을 하려다 말때 라이프 사이클은 어떻게 동작할까?
헷갈리지 않고 확신을 가지고 대답할 수 있을까?
나는 아니다,,아무튼 그런 관계로 오늘 주제는 여러 상황에서 View의 LifeCycle은 어떻게 동작하는지 알아보고 정리해두려고 한다.
이게 중요한가?
개인적으론 중요하다고 생각한다.
어느 시점에 어떻게 호출되냐에 따라 불필요한 API 콜이나 화면을 다시 그리는 리소스를 잡아먹는 일을 경우에 따라 줄일 수 있을 것이고, 화면을 다시 그려줘야 하는 상황에서도 이용해먹을 수 있다.
각설하고 Present부터 시작해보겠다

superview loadView()
superview viewDidLoad()
superview viewWillAppear(_:)
superview viewDidAppear(_:)
// present VC를 present했을 때
present loadView()
present viewDidLoad()
present viewWillAppear(_:)
present viewDidAppear(_:)
// present VC를 절반만 내렸을 때
present viewWillDisappear(_:)
// present VC를 절반만 내렸다 다시 올렸을 때
present viewWillDisappear(_:)
present viewWillAppear(_:)
present viewDidAppear(_:)
// present VC를 전부 내렸을 때
present viewWillDisappear(_:)
present viewDidDisappear(_:)
present는 기본적으로 modal 형태로 VC가 나타난다.
modal형태는 '사용자가 보고있는 화면에 다른 화면을 띄우는 방식'을 말한다.
modal은 화면을 완전히 전환하는게 아니라 화면위에 다른 화면을 띄우는 방식이기 때문에, 위 예시에서 super VC는 present VC가 나타난다고 해도 아무런 영향을 받지 않는 다는 것을 알 수 있다
present도 화면이 완전히 사라지는게 아닌 이상 viewDidDisappear가 호출되지 않는다.
반대로 화면을 다시 내렸다 올린다 해도 present VC가 완전히 사라진게 아니기 때문에, viewDidLoad는 호출되지 않는다.

superview loadView()
superview viewDidLoad()
superview viewWillAppear(_:)
superview viewDidAppear(_:)
// push VC를 push 했을 때
push loadView()
push viewDidLoad()
superview viewWillDisappear(_:)
push viewWillAppear(_:)
superview viewDidDisappear(_:)
push viewDidAppear(_:)
// push VC를 pop 했을 때
push viewWillDisappear(_:)
superview viewWillAppear(_:)
push viewDidDisappear(_:)
superview viewDidAppear(_:)
Push하게 되면 새로운 VC로 완전히 화면을 가려버린다.
이는 present와 완벽하게 다르게 동작한다는 것을 보여준다.
기존 super VC는 화면에서 완전히 사라지기 때문에
push VC의 viewDidLoad가 호출되자마자
super VC의 viewWillAppear가 호출되고,
push VC가 viewWillDisappear 호출 되자마자
super VC의 viewWillAppear 호출된다.
반대로 push VC가 pop되면
push VC의 viewWillDisappear 호출되자마자
super VC의 viewWillAppear가 호출되고,
push VC가 viewDidDisappear 호출 되자마자
super VC의 viewDidAppear 호출된다.
새로운 뷰가 willAppear 또는 willDisAppear가 되면, 기존 뷰는 바로 이어서 willDisappear 또는 didAppear가 된다는 점
그리고 가려졌던 super VC가 다시 화면에 나타날 때 viewDidLoad는 호출되지 않는다는 점이다.
viewDidLoad는 VC가 메모리에 처음 로드될 때 딱 한번 호출된다. 그 의미는 push로 새로운 VC가 superVC를 가리더라도 superVC는 deinit되지 않고 있다는 뜻이고
그렇기 때문에, viewWillAppear와 viewDidAppear만 호출이 되는 것이다.

// push VC를 절반만 없앴다 다시 돌아왔을 때
push viewWillDisappear(_:)
superview viewWillAppear(_:)
superview viewWillDisappear(_:)
superview viewDidDisappear(_:)
push viewWillAppear(_:)
push viewDidAppear(_:)
여기서도
push VC가 사라지려 viewWillDiappear가 호출되자마자
super VC의 viewWillAppear가 호출된다.
이어서 super VC 다시 사라지려하자
viewWillDisappear가 호출되고
완전히 가려지자 viewDidDisappear가 호출됐다.
이 후 push VC의
viewWillAppear, viewDidAppear가 차례로 호출됐다.
하,,,
아까는 분명 서로 한번씩 호출했는데 이번에는 superVC가 모두 호출된 후 pushVC가 차례로 호출됐다.
그냥 한번 씩 호출하는걸로 통일해줘
아무튼 경우에 따라 다르게 호출된다는 걸 알았고 면접볼 일 있으면 꼭 다시 한번 봐야겠다.