iOS/UIKit

생명주기 (2) [ ViewController 생명주기 ]

Hamp 2024. 8. 31. 17:15
반응형

 

 

이전 학습은 iOS 앱의 전체적인 생명주기를 봤다면 이번에는 조금 더 작은 단위인
ViewController의 생명주기를 학습할껀데.

 

각 콜밸 함수의 호출 시기와 역할로 구분해서 학습해보자.

 

 


1. loadView

역할

ViewController는 메모리에 올라온 후, 인스턴스 메서드인 loadView()를 통해 화면(view)을 메모리 올린다.

 

⚠️ 스토리보드(Interface Builder)를 통해 View를 생성 및 초기화하는 경우 loadView() 메서드를 재정의해서는 안된다.

 

만약 view를 수동으로(코드로) 생성했다면 loadView()를 재정의해서
ViewController의 view에 직접 생성한 view를 할당 한다. ( super.loadView() 불필요 )


2. viewDidLoad

호출 시기

- view가 메모리에 올라온 후 호출

 

- 스토리보드의 뷰객체와 ViewController의 코드가 연결된 후 호출

 

- 뷰가 메모리에 올라온 후, 한 번만 호출

역할

view의 추가 초기화를 진행하려면 이 viewDidLoad()를 재정의하여 사용

 

view가 단지 메모리에 올라간 상태이기 때문에
view의 사이즈나 애니메이션과 같이 뷰가 보여진 후 작업은 여기서 하지 않는다.


3. viewWillAppear

호출 시기

- view가 화면에 나타나기 전에 호출된다.

 

- ViewController가 메모리에 올라올 때, 한 번만 실행되는 viewDIdLoad()와 다르게 화면을 띄워줄 때 마다 호출

역할

뷰를 띄울 때마다 특정 처리가 필요하거나, 다른 뷰에서 처리한 작업 결과로 인해 뷰를 업데이트해야 하는 경우에 사용된다.


4. viewDidAppear

호출 시기

- 스크린에 뷰가 나타난 후 호출된다.

역할

뷰의 애니메이션을 시작하거나, 타이머를 시작하는 등 화면이 나타난 후 필요한 작업을 처리한다.


5. viewWillDisappear

호출 시기

- 스크린에서 뷰가 사라지기 전에 호출된다.

역할

진행 중인 애니메이션을 멈추거나, 타이머를 종료시키는 등의 작업을 처리한다.


6. viewDidDisappear

호출 시기

- 스크린에서 뷰가 사라진 후 호출된다.

- 단지 화면이 스크린에서 내려갔을 뿐, 메모리에서 해제된 것은 아니다.

 


추가로 여러 화면 전환 시 호출되는 콜백함수를 검증해보자. 

1. Tab bar

 

다른 화면으로 전환되더라도, 메모리에서 해제되지 않는다.
(TabBarController가 하위의 VC들을 강하게 참조하여 RC를 유지시킨다.)

 

Tab1 -> Tab2 이동

viewDidLoad(Tab 2 첫 load만 호출) -> WillAppear → WillDisappear → DidDisappear → DidAppear

2. NavigationController push

 

push를 사용하여 화면을 전환할 때, 생명주기 함수 호출은 TabBar를 사용한 화면 전환과 동일하지만

pop을 통해 원래의 VC로 돌아올 때, ViewController가 메모리에서 해제되어 deinit이 호출된다.

 

다시 push 하여 VC를 전환하면 viewDidLoad()가 호출된다.

 

push

init -> DidLoad → WillDisappear → WillAppear → DidDisappear → DidAppear

 

Pop

WillDisappear → WillAppear → DidDisappear → DidAppear → deinit

 


3. Modal

modal은 modalPresentationStyle에 따라 호출 순서가 달라진다. 

a) Style: 기본값, Page Sheet, Form Sheet

 

기존 ViewController를 완전히 덮지 않는 Presentation 설정의 경우,modal로 띄우는
ViewController에 대한 생명주기 함수만 호출되었다.

present

didLoad → WillAppear → DidAppear

 

dismiss

WillDisappear → WillAppear → DidDisappear → DidAppear → deinit

 

 

b) StyleFull Screen

 

Full Screen 설정의 경우, 루트 뷰 컨트롤러를 완전히 덮기 때문에 push를 사용한 뷰 전환과
마찬가지로 이전 ViewController의 생명주기 함수도 같이 호출된다.

 

present

init -> DidLoad → WillDisappear → WillAppear → DidAppear → DidDisappear

 

dismiss

WillDisappear → WillAppear → DidDisappear → DidAppear → deinit

 

c) Style Over Full Screen, Over Current Context

 

두 modal 스타일은 분명 루트 뷰 컨트롤러를 완전히 덮는데도 modal 기본값
설정처럼 루트 뷰 컨트롤러의 생명주기 함수가 호출되지 않는다.

 

이유는 이름에서 알 수 있듯이 루트 뷰 컨트롤러의 화면 위에 Over해서 화면을 쌓기 때문이다.

 

present

DidLoad → WillAppear → DidAppear

 

dismiss

WillDisappear → DidDisappear → deinit

참고 

생명주기

 

반응형