View Controller의 생명주기(LIfe-Cycle)
12 Feb 2020 | iOS개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
iOS를 공부하면서 간단한 실습을 하다보니 view controller의 생명주기에대해 공부할 필요성을 느꼈다. 처음 접헀을때는 이게 쓸일이 있을까? 싶은 코드였는데, 꼭꼭 반드시 필요하고 제대로 알고 있어야하는 개념이었다. 실제 코드에 사용해보기도 했지만, 조금 헷갈리는 부분들이 있어 정리를 하게 되었다.
View Controller Life Cycle
앱들은 모두 View Controller 로 이루어져있다. 화면이 하나만으로 구성되는 앱도 있겠지만, 대부분의 앱은 여러개의 화면들로 구성되어있을 것이다. 이런 각각의 뷰들은 각각의 생명주기를 가지고 있고, 가져야 한다. 뷰 컨트롤러에게 있어서 생명주기란 보여지고 사라지는 주기 를 의미한다.
뷰 컨트롤러는 위 사진과 같은 주기를 가지게 된다. 기본적으로 우리가 이해하기에는 아래를 이해하면 된다.
viewDidLoad
viewWillAppear
viewDidAppear
viewwillDisappear
viewDidDisappear
그냥 보면 무슨 함수인지 모르겠지만, 함수의 이름을 잘 살펴보면 Will 과 Did 가 보임을 알 수 있다. Will은 우리가 알고있듯 미래를 의미할 것이고, Did는 과거를 의미할 것이다. 하나씩 제대로 살펴보도록 하자!
loadView()
화면에 띄워줄 view를 만드는 메소드로 view를 만들고 메모리에 올린다.
실제로 해당 함수는 사용자가 직접 호출하여 사용하는 경우는 없다. 직접 코딩으로 만들어 사용하지 않는다면 이 함수를 override하여 사용하는 것은 좋지않다고 한다. 참고링크 바로가기
즉, 스토리보드나 nib(xib)를 사용하지 않는 경우에만 이 메소드를 직접 오버라이드 하여 뷰를 만들고 뷰 계층을 생성해준다.
viewDidLoad
뷰의 컨트롤러가 메모리에 로드된 후 호출되며 시스템에 의해 자동으로 호출된다.
익숙한 함수일 것이다. 프로젝트를 만들면 뷰 컨트롤러에 항상 꼭 보이는 함수이기 때문이다.
이 함수는 왜 항상 존재하는것이며 그래서 이 함수가 하는 일은 무엇일까?
애플 문서에 따르면
“Called after the controller’s view is loaded into memory”
뷰의 컨트롤러가 메모리에 로드되고 난 후 호출된다
라고 의미한다. 우선 모든 뷰는 메모리에 올라가야 우리가 접근이 가능할 것이다. 그렇기 때문에 이 viewDidLoad 함수의 기능은 뷰의 로딩이 완료되었을때 시스템에 의해 자동으로 호출되어 일반적으로 리소스를 초기화하거나 초기화면을 구성하는 용도로 사용한다.
즉, 사용자에게 화면이 보여지기 전에 데이터를 뿌려주는 행위에 대한 코드를 작성하면 되고, 일반적으로 리소스를 초기화하거나 초기화면을 구성하는 용도로 자주 쓰인다. 이 메소드는 view controller 생에 단 한번만 호출이 되기 때문에 한번만 있을 행위에 대해서는 이 메소드 안에 정의해주면 된다. (화면이 처음 만들어질때 한번만 실행되기 때문에 처음 한번만 실행해야 하는 초기화 코드가 있을 경우 해당 메소드 내부에 작성하면 되는 것이다!)
viewWillAppear
뷰 컨트롤러의 화면이 올라오고 난 후 뷰가 화면에 나타나기 직전에 호출이 된다.
즉, 뷰가 로드된 이후 눈에 보이기 전에 컨트롤러에게 알리는 역할을 한다. 다른 뷰로 이동했다가 되돌아올때 재 호출되는 메소드로 화면이 나타날때마다 수행해야하는 작업을 정의하기 좋다. 처음 어플리케이션이 수행되고 첫 화면이 띄워질 때 호출되는 것은 viewDidLoad()와 동일하지만, 화면 전환을 통해 다시 현재의 화면으로 돌아올때는 viewDidLoad()가 아닌 viewWillAppear()가 호출된다.
즉, 뷰가 뷰 계층에 추가되기 직전에, 또 해당 뷰가 나타나기 위한 애니메이션이 설정되기 전에 호출된다. 이 메서드를 오버라이드해서 뷰가 화면에 나타나기 전에 필요한 추가적인 작업을 수행할 수도 있다.
viewDidAppear
view가 데이터와 함께 완전히 화면에 나타난 후 호출되는 메서드이다.
즉, 뷰가 나타났다는 것을 컨트롤러에 알리는 역할로 뷰가 화면에 나타난 직후에 실행되며 화면에 적용될 애니메이션을 그려준다.
viewwillDisappear
다음 view controller화면이 전환하기 전이나 view controller가 사라지기 직전에 호출되는 메서드이다.
뷰가 뷰 계층에서 제거되기 직전, 이 뷰가 사라지기 위한 애니메이션이 설정되기 전에 호출된다. 이 메서드를 오버라이드 함으로써 해당 뷰를 통해 일어난 변화는 저장하거나, 최초 반응자(first responder) 상태를 내려놓거나, 뷰가 나타났을 때 조정됐던 다른 뷰들을 원래대로 돌려놓는 등의 작업을 수행할 수 있다.
viewDidDisappear
view controller들이 화면에서 사라지고 나서 호출되는 메서드이다.
화면이 사라지고나서 필요없어지는(멈춰야하는) 작업들을 여기서 진행한다.
시스템 메모리가 부족한 상황이 되면, 시스템은 뷰 컨트롤러에 메모리가 모자라다는 메시지를 보낸다. 이것이 didReseuceMemoryWarnig()
메서드로 이 메서드를 오버라이드 함으로써, 해제할 수 있는 메모리를 최대한으로 해제하여 메모리를 확보하는 작업을 수행해야한다.
이렇게 뷰 컨트롤러의 참조가 0이 되게 되면 deinit()을 통해 뷰컨트롤러가 가지고 있던 뷰ㅘ 관련 자원들을 해제함으로써 완전히 생명주기가 끝나게 된다.