이전 학습은 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) Style: Full 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
참고
'iOS > UIKit' 카테고리의 다른 글
생명주기 (4) [ 업데이트 Cycle ] (2) | 2024.09.01 |
---|---|
생명주기 (3) [ View 생명주기 ] (0) | 2024.09.01 |
UIKit 코드 베이스 셋팅 (0) | 2024.09.01 |
생명주기 (1) [ iOS 앱 생명주기, Scene 생명주기 ] (2) | 2024.08.31 |
UIResponder Chain (1) | 2024.08.30 |