저번주 스터디에서 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