[iOS] UIViewController Lifecycle
ViewController의 책임 중 하나는 View의 Lifecycle을 관리하는 것임

AppDelegate에서 앱이 실행되고 didFinishLaunchingWithOptions가 호출되고 나면
ViewController는 View를 화면에 출력하고 모든 View가 출력이 되고나면 DidBecomActive가 호출되고 이때부터 Application의 state는 active로 전환이 되어짐
ViewController가 View를 화면에 출력하기 위해서는
View를 생성하고- 생성된
View를 메모리에 올리고 - 메모리에 적재된
View를 설정한 옵션에 따라 배치
크게 위의 3가지 과정을 거치고, 각 단계 마다 적절한 메소드가 호출된다
loadView()
ViewController는 모두 기본 view라는 프로퍼티가 존재하고
이 프로퍼티를 사용해 view를 관리함
view는 옵셔널 타입의 프로퍼티이기 때문에 이 view가 nil이면 view를 생성하기위해
ViewController는 loadView() 메소드를 호출한다.
이 메소드를 사용하면 ViewController가 관리해야할 View를 생성하고 view 프로퍼티에 할당하게 됨
스토리보드를 사용한다면 이 메소드를 오버라이드 하면 안됨
viewDidLoad()
view 프로퍼티에 View가 load, 할당이 되고나서 1번 호출되는 메소드
이 시점에서 View가 메모리에 올라감
View가 생성되었기 때문에 View에 대한 초기화를 수행할 수 있지만
아직 Bounds가 정해지지 않은 상태
viewWillAppear()
view가 화면에 보여지기 직전에 호출되어짐
ViewController가 존재하는 동안 화면 전환과 같은 이벤트가 발생하면 호출되기 때문에 여러번 호출이 가능
viewWillLayoutSubviews
ViewController의 view의 subView의 layout을 변경하기 전에 호출됨
이 시점부터 view의 bounds를 알 수 있음
viewDidLayoutSubviews
view와 subview들의 size, position, 제약조건들이 설정된 시점
viewDidAppear
view가 화면에 출력이 되고 호출됨
viewWillDisappear
view가 화면에서 사라지기 직전에 호출되어짐
viewDidDisappear
view가 화면에서 사라지고 난 뒤에 호출
didReceiveMemoryWarning
Application에서 개발자가 직접 호출하면 안되는 메소드
시스템이 사용가능한 메모리가 부족하다고 판단되면 호출됨
이 메소드를 오버라이드하여 ViewController에서 사용하는 메모리를 해제할 수 있음
traitCollectionDidChange
테마(다크/라이트모드)가 변경되거나 Layout, Appearance등이 변경되면 호출되는 메소드
이 메소드가 호출되는 시점은 traitCollection의 변경이 확정된 상태
시나리오별 메소드 호출 순서
첫 실행
loadView를 통해 UIView가 생성되고 view에 할당- view가 메모리에 올라가면
viewDidload호출 - view를 그리기 전
viewWillAppear호출 - view를 그리기위한 인터페이스 환경 적용 후
traitCollectionDidChange호출 - view / subView의 layout 설정을 시작하기 전
viewWillLayoutSubviews호출 - view / subView의 layout 설정을 마치고
viewDidLayoutSubviews호출 - view가 화면에 출력되고
viewDidAppear호출
1 ~ 6 단계 까지
Application의state는inactive이고 7 단계부터active상태
4 ~ 6단계는 view와 subview의 갯수만큼 반복
백그라운드 진입
- 인터페이스 환경이 변경되고
traitCollectionDidChange호출 viewWillLayoutSubviews호출viewDidLayoutSubviews호출
view와 subview의 갯수만큼 반복
백그라운드 진입, 백그라운드 → 포그라운드 진입시에 viewWillAppear / viewDidAppear / viewWillDisAppear / viewDidDisappear 메소드가 호출될줄 알았는데 호출되지 않는다?
Application의 state가 active상태에서만 호출이 되는것 같음
반면 traitCollectionDidChange / viewWillLayoutSubviews / viewDidLayoutSubviews는 계속 호출 되는되는 이유는 화면에 보여지는 것과 관련되있기 때문인것 같음
댓글남기기