[iOS] UIViewController Lifecycle

ViewController의 책임 중 하나는 ViewLifecycle을 관리하는 것임

AppDelegate에서 앱이 실행되고 didFinishLaunchingWithOptions가 호출되고 나면

ViewControllerView를 화면에 출력하고 모든 View가 출력이 되고나면 DidBecomActive가 호출되고 이때부터 Applicationstateactive로 전환이 되어짐

ViewControllerView를 화면에 출력하기 위해서는

  1. View를 생성하고
  2. 생성된 View를 메모리에 올리고
  3. 메모리에 적재된 View를 설정한 옵션에 따라 배치

크게 위의 3가지 과정을 거치고, 각 단계 마다 적절한 메소드가 호출된다

loadView()

ViewController는 모두 기본 view라는 프로퍼티가 존재하고

이 프로퍼티를 사용해 view를 관리함

view옵셔널 타입의 프로퍼티이기 때문에 이 viewnil이면 view를 생성하기위해

ViewControllerloadView() 메소드를 호출한다.

이 메소드를 사용하면 ViewController가 관리해야할 View를 생성하고 view 프로퍼티에 할당하게 됨

스토리보드를 사용한다면 이 메소드를 오버라이드 하면 안됨

viewDidLoad()

view 프로퍼티에 Viewload, 할당이 되고나서 1번 호출되는 메소드

이 시점에서 View가 메모리에 올라감

View가 생성되었기 때문에 View에 대한 초기화를 수행할 수 있지만

아직 Bounds가 정해지지 않은 상태

viewWillAppear()

view화면에 보여지기 직전에 호출되어짐

ViewController가 존재하는 동안 화면 전환과 같은 이벤트가 발생하면 호출되기 때문에 여러번 호출이 가능

viewWillLayoutSubviews

ViewControllerviewsubViewlayout변경하기 전에 호출

이 시점부터 viewbounds를 알 수 있음

viewDidLayoutSubviews

viewsubview들의 size, position, 제약조건들이 설정된 시점

viewDidAppear

view화면에 출력이 되고 호출됨

viewWillDisappear

view화면에서 사라지기 직전에 호출되어짐

viewDidDisappear

view화면에서 사라지고 난 뒤에 호출

didReceiveMemoryWarning

Application에서 개발자가 직접 호출하면 안되는 메소드

시스템이 사용가능한 메모리가 부족하다고 판단되면 호출

이 메소드를 오버라이드하여 ViewController에서 사용하는 메모리를 해제할 수 있음

traitCollectionDidChange

테마(다크/라이트모드)가 변경되거나 Layout, Appearance등이 변경되면 호출되는 메소드

이 메소드가 호출되는 시점은 traitCollection의 변경이 확정된 상태

시나리오별 메소드 호출 순서

첫 실행

  1. loadView를 통해 UIView가 생성되고 view에 할당
  2. view가 메모리에 올라가면 viewDidload 호출
  3. view를 그리기 전 viewWillAppear 호출
  4. view를 그리기위한 인터페이스 환경 적용 후 traitCollectionDidChange 호출
  5. view / subView의 layout 설정을 시작하기 전 viewWillLayoutSubviews 호출
  6. view / subView의 layout 설정을 마치고 viewDidLayoutSubviews 호출
  7. view가 화면에 출력되고 viewDidAppear 호출

1 ~ 6 단계 까지 Applicationstateinactive이고 7 단계부터 active 상태

4 ~ 6단계는 view와 subview의 갯수만큼 반복

백그라운드 진입

  1. 인터페이스 환경이 변경되고 traitCollectionDidChange 호출
  2. viewWillLayoutSubviews 호출
  3. viewDidLayoutSubviews 호출

view와 subview의 갯수만큼 반복

백그라운드 진입, 백그라운드 → 포그라운드 진입시에 viewWillAppear / viewDidAppear / viewWillDisAppear / viewDidDisappear 메소드가 호출될줄 알았는데 호출되지 않는다?

Applicationstateactive상태에서만 호출이 되는것 같음

반면 traitCollectionDidChange / viewWillLayoutSubviews / viewDidLayoutSubviews는 계속 호출 되는되는 이유는 화면에 보여지는 것과 관련되있기 때문인것 같음

참고

UIViewController Lifecycle

UITraitCollection 공부

iOS 다크모드 알아보기

댓글남기기