ViewController 생명 주기에 대해서 알아보자!
UIKit 프로젝트를 생성하면 바로 보이는 코드는 다음과 같다.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
viewDidLoad()가 보인다
이 viewDidLoad() 메서드가 ViewController의 생명 주기 메서드 중 하나이다.
그렇다면 ViewController의 생명 주기란 무엇일까?
앱은 여러 개의 ViewController로 구성되어 있다. 앱의 화면이 여러 개로 구성되어 있으면, 그만큼의 ViewController로 구성되어 있는 것이다. 이 ViewController들은 각각의 생명 주기를 가지고 있다.
즉, ViewController 생명 주기란 ViewController가 보여지고 사라지는 주기를 말한다.
애플 공식 문서에서 제공하는 다음 사진은 ViewController의 생명 주기를 보여준다.

으악 근데 보기 어렵다!! 다른 사진을 보자.

한결 이해하기 편한 사진이다 🥰
Appear은 나타남과 관련된 것이고 Disappear은 사라짐과 관련된 것이라는 걸 유추할 수 있다. 또한, Will과 Did는 미래와 과거를 나타낸다는 걸 유추할 수 있다.
자세히 하나씩 알아보자.
view가 Load되었다.
view가 메모리에 Load된 이후에 호출되는 것이다.
뷰의 로딩이 완료되었을 때 시스템에 의해 자동으로 호출된다. 그래서 일반적으로 리소스를 초기화하거나 초기 화면을 구성하는 용도로 사용된다.
화면이 처음 만들어질 때 한 번만 실행되기 때문에, 처음 한 번만 실행해야
하는 초기화 코드가 있을 경우 viewDidLoad 메소드 내부에 작성한다.
override func viewDidLoad() {
super.viewDidLoad()
configureLayout() // example 1
system.background = .white // example 2
}
view가 나타날 것이다.
view가 나타날 것이라는 신호를 ViewController에게 알리는 역할을 한다.
즉, ViewController에 해당 view가 뷰 계층 구조에 추가되려고 한다는 것을 알린다.
view가 나타났다.
ViewController에 해당 view가 뷰 계층에 추가되었음을 알리는 역할을 한다. 또한, 화면에 적용될 애니메이션을 그려준다.
view가 화면에 나타난 직후에 실행된다.
view가 사라질 것이다.
ViewController에 해당 view가 뷰 계층에서 제거되려고 한다는 것을 알린다.
view가 사라지기 직전에 호출되는 함수이다.
view가 사라졌다.
Viewcontroller에 해당 view가 뷰 계층에서 제거되었음을 알린다.
첫 번째 화면은 파란색 배경의 view, 두 번째 화면은 흰색 배경의 view. 두 가지의 view를 띄워볼 것이다.

첫 번째 화면을 띄우면 콘솔에 viewDidLoad, viewWillAppear, viewDidAppear 메서드가 순서대로 등장하는 것을 볼 수 있다.
두 번째 view로 넘어가기 위해 버튼을 눌러보자!

2: viewDidLoad, 1: viewWillDisappear, 2: viewWillAppear, 1: viewDidDisappear, 2: viewDidAppear가 순서대로 호출된다.
두 번째 view가 메모리에 load된 이후, 첫 번째 view는 사라질 준비를 한다. 이후 두 번째 view는 나타날 준비를 하고 첫 번째 view가 사라진 이후에야 두 번째 view가 나타나게 된다!
뒤로 가기 버튼을 통해 다시 첫 번째 view로 돌아가보자.

2: viewWillDisappear, 1: viewWillAppear, 2: viewDidDisappear, 1: viewDidAppear가 순서대로 호출된다.
두 번째 view가 사라질 준비를 하고, 첫 번째 view는 다시 나타날 준비를 한다. 두 번째 view가 사라지면 첫 번째 view가 나타난다.
어라 근데 틀린 그림 찾기를 해보면 다시 첫 번째 view로 되돌아 올 때에는 viewDidLoad()가 호출되지 않는다?
그 이유는 앞에서 이미 설명했다. viewDidLoad()는 화면을 구성할 때 딱 한 번만 호출되기 때문이다!!!
즉, ViewController의 LifeCycle은 앞에서 제시한 사진처럼 viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear이 반복된다.
말로 설명하면 어렵지만, 실습을 해보면 이해가 쉽다!
loadView가 소외됐다...
애플 공식 문서를 보면 Discussion의 첫 문장이 "You should never call this method directly."라는 것을 볼 수 있다.
never?
딱봐도 무서워 보이는 문장이다!!
해석해보면 절대로 loadView()를 직접 호출하면 안 된다는 뜻이다. 왜냐하면 뷰 속성이 요청되면 ViewController에서 이 메서드를 호출하지만, nil인 상태이기 때문이다.
뷰의 추가적인 초기화를 수행하려면 viewDidLoad()에서 수행하라고 한다.
그러면 loadView는 왜 있는 걸까?
ViewController가 관리하는 view를 만드는 역할이다.
그러면 loadView가 view를 만들고 메모리에 올린 후, viewDidLoad가 호출된다.
viewController LifeCycle은 iOS 개발에서 굉장히 중요한 개념이다.
열공 완료.
출처
https://developer.apple.com/documentation/uikit/uiviewcontroller
https://zeddios.tistory.com/43