저번주 스터디에서 UIViewController의 생명주기에 대해 공부하고, 꼬리 질문으로 나올 수 있는 것들을 정리했다.
🔑 키워드: init, loadView, viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear
우선 UIViewController는 UIKit 앱의 뷰 계층을 관리하는 객체이며, UIResponder를 상속받고 있습니다.
이러한 UIViewController는 생명주기를 가지고있으며, 화면이 표기되기 전부터 제거될 때까지의 cycle을 의미합니다.
라이프 사이클을 말씀드리자면,
먼저 init이 호출되어 뷰컨트롤러가 생성되고,
뷰컨트롤러가 관리하는 뷰를 생성하고 로드하는 loadView 메서드가 호출됩니다.
이때, 다른 오버라이드 메서드와는 다르게 super.init을 호출하지 않습니다.
그리고 생성된 뷰가 메모리에 로드된 후에 viewDidLoad 메서드가 호출되는데,
뷰가 메모리에 올라갈 때 한번만 호출됩니다.
뷰 계층에 뷰가 추가되기 전에, 이를 뷰컨트롤러에게 알리기 위해 viewWillAppear 메서드가 호출됩니다.
화면이 나타나기 직전에 호출되기 때문에, 화면이 나타날 때마다 초기화되어야하는 코드를 작성합니다.
뷰 계층에 뷰가 추가된 직후에, 이를 뷰컨트롤러에게 알리기 위해 viewDidAppear 메서드가 호출됩니다.
뷰가 화면에 나타난 직후에 호출되며, 애니메이션 등의 처리를 할 수 있습니다.
뷰 계층에서 뷰가 제거되기 전에, 이를 뷰컨트롤러에게 알리기 위해 viewWillDisappear 메서드가 호출되고,
뷰가 완전히 화면에서 사라진 직후에 viewDidDisappear 메서드가 호출됩니다.
뷰 컨트롤러의 참조가 0이 되면 deinit을 통해 뷰 컨트롤러가 가지고 있던 뷰와 관련 자원들을 해제함으로써 생명주기가 끝나게 됩니다.
🔑 키워드: loadView - 기본 뷰를 커스텀뷰로 사용 viewDidLoad - 기본 뷰를 커스텀해서 사용
🔑 키워드: viewDidUnload didReceiveMemoryWarning
navigation controller로 화면을 push/pop할 때는 기존의 뷰가 가려지고 그 위에 새로운 뷰가 push되는 stack 구조입니다.
그래서 기존의 뷰의 viewWillDisappear -> 새로운 뷰의 viewWillAppear, viewDidAppear -> 기존 뷰의 viewDidDisappear가 호출되는 방식으로 뷰가 그려집니다.
modal로 화면을 present 할 때에는 기존의 뷰가 사라지는 것이 아니라 그 위에 새로운 뷰가 보여지기 때문에 첫번째 뷰컨트롤러의 viewWillDisappear와 viewDidDisappear 메서드가 호출되지 않습니다.
https://developer.apple.com/documentation/uikit/uiviewcontroller
https://jcsoohwancho.github.io/2019-09-21-iOS-뷰컨트롤러의-생명주기/
https://zeddios.tistory.com/43