Swift + iOS/iOS

[ios] UIViewController LifeCycle - 추가

군옥수수수 2018. 7. 6. 21:13

[ios] UIViewController LifeCycle - 추가


안녕하세요. 오늘은 다시 기본으로 돌아가 개념을 확실히 다잡기 위해 이전에 다루었 UIViewController LifeCycle 글에 내용을 조금 더 추가해보았습니다.


기존의 글에서는 단순히 UIViewController의 Life Cycle 관련 메소드들을 소개하는 수준이었습니다. 오늘은 UINavigationController 위에서 UIViewController들을 호출해가며 실제로 서로 다른 UIViewController들의 메소드들이 어떠한 순서로 호출되는지 살펴보도록 하겠습니다.


먼저 UINavigationController는 루트 뷰 컨트롤러를 하나 갖고 있습니다. UINavigationController에서 뷰 컨트롤러들의 Life Cycle은 어떻게 돌아갈까요?


루트 뷰 컨트롤러에서는 viewWillDisappear가 호출될 것 같고...! 올라오는 뷰 컨트롤러에서는 나타나는 viewWillAppear가 호출될 것 같은데 정확한 이들 메소드의 호출 순서는 어떻게 될까요?


이를 이해하기 위해서는 UINavigationController는 기본적으로 스택 (Stack)의 자료구조로 뷰 컨트롤러를 관리한다는 사실을 알고 있어야 합니다.



이렇게 UINavigationController 안의 뷰 컨트롤러들은 팝(Pop)되기 전까지 메모리에서 사라지지 않습니다. 그 말인즉슨 팝이 되야 메모리에서 사라진다는 것이고 그제서야 deinit 메소드가 호출됩니다.


그럼 이제 본격적으로 푸시되고 팝 될때 두 뷰 컨트롤러는 어떤 단계를 어떤 순서로 서로 충돌되지 않게끔 자신들의 뷰를 화면에 띄우고 사라지는지 직접 다이어그램으로 살펴보도록 하겠습니다.


직접 메소드들을 호출해가며 확인하시는게 이해하는데 도움이 되실 것입니다.

먼저 푸시되는 상황을 살펴보겠습니다.


push


UIViewController-1이 먼저 보이는 뷰 컨트롤러고 이는 init 부터 viewDidAppear까지 위에 나열된 순서대로 메소드들을 호출해가며 화면에 나타납니다. 그리고 여기서 푸시를 하게 되면 그 위로 UIViewController-2가 올라오게 됩니다. 이때 푸시 될 UIViewController-2를 메모리에서 불러오는 작업을 먼저 수행합니다. 그 과정이 바로 init 부터 viewDidLoad까지입니다.


지금까지는 단순히 메모리로부터 불러오고 이들을 조합하고 위치를 조정하는 단계였고 아직 화면에 보이는 상태는 아닙니다. 그리고 사라질 UIViewController-1가 "사라질 것이다"라는 메소드를 호출하고 UIViewController-2는 "나타날 것이다"라는 메소드를 호출합니다.


마지막으로 UIViewController-1이 "사라졌다" 라는 메소드를 호출하고 이를 확인 후 UIViewController-2도 "나타났다"라는 메소드를 호출할 것입니다.


이렇게 서로 메소드를 교차하며 호출하여 충돌을 피해서 화면에서 사라지고 화면에서 나타나게 되는 것입니다. 여기서 주목해야할 것은 UIViewController-1deinit 메소드가 호출되지 않는다는 것입니다. 왜냐하면 단순히 가려진 것이지 메모리에서 사라진 것은 아니기 때문입니다.


그렇다면 팝이 될 때는 어떨까요?


pop


역시 사라지는 쪽에서 "사라질 것" 이라고 의사를 내비치는 것입니다. 그리고 위와 같은 순서로 메소드들이 호출되며 역시 팝이 되는 상황도 충돌을 피하며 사라지고 나타나는 것입니다.


여기서 주목해야할 점은 UIViewController-2UINavigationController의 스택 안에서 벗어나는 팝 연산이고 메모리에서 사라지기 때문에 deinit 메소드가 호출된다는 점입니다.


그리고 이전 포스팅에서 loadView가 호출되는 시점에서 IBOutletIBAction들이 생성되고 연결된다고 언급했습니다.이 역시 직접 메소드들을 호출해가며 확인해보았습니다. 그 결과는 다음과 같습니다.




마무리

오늘은 이렇게 예전에 학습했고 포스팅까지 했던 UIViewController의 LifeCycle을 다시 살펴보고 직접 호출해가며 개념을 다잡는 시간을 가졌습니다. 감사합니다.