IOS

IOS - ViewController의 생명주기(Life Cycle)

clamp 2022. 7. 21. 17:04

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하는 것을 멈추기, 디바이스의 센서를 점검하거나 네트워크를 호출하는 행위들은 사라지고 나서는 필요 없는 작업들이라고 한다.

 

* 화면이 사라지고나서 필요없는 작업을 멈추기 위해 사용.

 


뷰 컨트롤러의 생명주기란 개념이 왜 필요할까❓

위의 함수들은 내부적인 메커니즘에 의해서 자동으로 호출되는 함수들이 있다. 이런 함수들을 이용해 화면의 전환시점에 실행해야할 함수들을 실행시킬 수 있다.

예시) 다음 화면으로 갔다가 다시 돌아오면, 변경사항 업데이트를 위해 서버에서 데이터를 다시 받아와야할 수도 있음. 

 

 

이런 작업들을 위해 뷰 컨트롤러의 생명 주기 개념이 필요하다

 

 

참고.

https://mini-min-dev.tistory.com/33