ViewController의 생명주기(Life Cycle)
IOS에서 화면을 구성하는 요소인 ViewController가 나타나서 사라지기까지의 주기를 의미한다.
그림을 보면 will과 did가 반복적으로 사용된다
will은 ~할 것이다. 라는 뜻을 가지며 did는 ~했다. 라는 의미를 가진다.
이 주기들의 순서는 다음과 같다.
->loadView(뷰 로드) -> viewDidLoad(뷰가 로드되었다) -> viewWillAppear(뷰가 나타날 것이다)
-> viewDidAppear(뷰가 나타났다)
-> viewWillDisappear(뷰가 사라질 것이다) -> ViewDidDisappear(뷰가 사라졌다) -> viewDidUnload(뷰가 언로드 되었다)
1. override func loadView
뷰를 메모리에 적재하는 역할만 한다.
뷰를 바꿀 수 있는 시점이 이곳이다.(코드로 뷰를 짠다면)
== > 코드로 UI를 짤 때 스토리보드로 만들어진 화면이 아니라 코드로 짜여진 화면을 불러오는 함수 ⭐️
// ViewController.swift
let customView: CustomView()
override func loadView(){
super.loadView() // ❌ 재정의해서 뷰를 교체할 경우 super 호출을 하면 안된다
view = customView
}
...
일반적으로 프로젝트에서는 호출하면 안되는 함수이다.
이 함수를 호출하는 의미 == 스토리보드로 만들어 놓은 화면을 호출하지 않고, 내가 만들어 놓은 화면을 호출할거야❗️
만약 이 함수 내부에서 뷰를 이미 만들어 놓은 뷰로 교체해주지 않으면 화면이 검은색으로 변하고 아무것도 보이지 않는다.
2. override func viewDidLoad
override func viewDidLoad(){
super.viewDidLoad()
}
스토리보드상의 뷰들과 코드와의 연결이 끝난 후 호출된다.
뷰 컨트롤러를 생성하면 기본적으로 생성되는 메서드다. 뷰가 메모리에 적재된 후 호출되는 메서드다
메모리에 처음 로딩될 때 "딱 1번만" 자동적으로 호출된다
* 초기 화면을 구성하거나, 처음 한 번만 실행해야 하는 초기화 코드가 있을 때 사용된다.
3. override func viewWillAppear
override func viewWillAppear(_ animated: Bool){
super.viewWillAppear(animated)
}
뷰가 나타나기 직전에 호출되는 메서드이다. viewDidLoad와 다르게 뷰가 보여질 때 마다 호출된다.
만약 뷰1에서 뷰2로 이동되었다가 다시 뷰1로 돌아왔을때를 예를든다.
뷰1 -> 뷰2 -> 뷰1
viewDidLoad. viewDidLoad viewWillAppear
viewWillAppear viewWillAppear
이미 메모리에 적재된 뷰가 다시 화면으로 돌아왔을때 처리해주고 싶은 데이터가 있다면
viewWillAppear을 사용한다
* 화면전환 이후 다시 돌아왔을 때, 처리해줘야 하는 작업(주로 데이터 변경)이 있을 때 사용된다.
4. override func viewDidAppear
override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated)
}
뷰가 나타난 직후에 호출되는 메서드
나타난 직후이므로, 뷰가 나타났다는 것을 정상적으로 컨트롤러에게 알리는 역할을 한다.
뷰를 보여줄 때 추가적으로 필요한(애니메이션) 작업이 여기에 들어가게 된다.
5. override func viewWillDisappear
override func viewWillDisappear(_ animated: Bool){
super.viewWillDisappear(animated)
}
뷰가 사라지기 직전에 호출되는 메서드
ex) 애니메이션 멈춤, 타이머앱 - 초 멈춤
6. override func viewDidDisappear
override func viewDidDisappear(_ animated: Bool){
super.viewDidDisappear(animated)
}
뷰가 사라지고 난 직후 호출된다.
사라지고 난 직후이므로, 정상적으로 뷰가 사라졌다는 것을 알리는 역할을 한다.
예를들어 notification을 듣는 행위를 멈추기, 다른 객체의 속성을 observing하는 것을 멈추기, 디바이스의 센서를 점검하거나 네트워크를 호출하는 행위들은 사라지고 나서는 필요 없는 작업들이라고 한다.
* 화면이 사라지고나서 필요없는 작업을 멈추기 위해 사용.
뷰 컨트롤러의 생명주기란 개념이 왜 필요할까❓
위의 함수들은 내부적인 메커니즘에 의해서 자동으로 호출되는 함수들이 있다. 이런 함수들을 이용해 화면의 전환시점에 실행해야할 함수들을 실행시킬 수 있다.
예시) 다음 화면으로 갔다가 다시 돌아오면, 변경사항 업데이트를 위해 서버에서 데이터를 다시 받아와야할 수도 있음.
이런 작업들을 위해 뷰 컨트롤러의 생명 주기 개념이 필요하다
참고.