UIViewController의 생명 주기

marisol👩🏻‍💻·2022년 8월 21일
0

저번주 스터디에서 UIViewController의 생명주기에 대해 공부하고, 꼬리 질문으로 나올 수 있는 것들을 정리했다.


📝 UIViewController의 생명주기를 설명하시오.

🔑 키워드: init, loadView, viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear

우선 UIViewController는 UIKit 앱의 뷰 계층을 관리하는 객체이며, UIResponder를 상속받고 있습니다.
이러한 UIViewController는 생명주기를 가지고있으며, 화면이 표기되기 전부터 제거될 때까지의 cycle을 의미합니다.

라이프 사이클을 말씀드리자면,
먼저 init이 호출되어 뷰컨트롤러가 생성되고,
뷰컨트롤러가 관리하는 뷰를 생성하고 로드하는 loadView 메서드가 호출됩니다.
이때, 다른 오버라이드 메서드와는 다르게 super.init을 호출하지 않습니다.

그리고 생성된 뷰가 메모리에 로드된 후에 viewDidLoad 메서드가 호출되는데,
뷰가 메모리에 올라갈 때 한번만 호출됩니다.

뷰 계층에 뷰가 추가되기 전에, 이를 뷰컨트롤러에게 알리기 위해 viewWillAppear 메서드가 호출됩니다.
화면이 나타나기 직전에 호출되기 때문에, 화면이 나타날 때마다 초기화되어야하는 코드를 작성합니다.

뷰 계층에 뷰가 추가된 직후에, 이를 뷰컨트롤러에게 알리기 위해 viewDidAppear 메서드가 호출됩니다.
뷰가 화면에 나타난 직후에 호출되며, 애니메이션 등의 처리를 할 수 있습니다.

뷰 계층에서 뷰가 제거되기 전에, 이를 뷰컨트롤러에게 알리기 위해 viewWillDisappear 메서드가 호출되고,
뷰가 완전히 화면에서 사라진 직후에 viewDidDisappear 메서드가 호출됩니다.

뷰 컨트롤러의 참조가 0이 되면 deinit을 통해 뷰 컨트롤러가 가지고 있던 뷰와 관련 자원들을 해제함으로써 생명주기가 끝나게 됩니다.

📌 꼬리 질문

1. loadView와 viewDidLoad의 차이?

🔑 키워드: loadView - 기본 뷰를 커스텀뷰로 사용 viewDidLoad - 기본 뷰를 커스텀해서 사용

  • loadView는 뷰 컨트롤러가 자신의 뷰를 생성하려고 호출하는 메서드입니다. 그래서 loadView 메서드 내에서 새로운 뷰를 만들어서 반환해줄 수도 있습니다. 그래서 뷰 컨트롤러의 기본 뷰를 커스텀 뷰로 사용하고자 할 때 유용합니다.
  • viewDidLoad는 뷰가 모두 생성되고 메모리에 올라간 후에 호출되는 메서드입니다. 기본 UIView를 뷰컨트롤러의 기본 뷰로 사용하고, 그 위에 무언가 커스텀해서 사용하고 싶다면 viewDidLoad에서 해줄 수 있습니다.

2. 메모리가 부족할 때 시스템이 뷰 컨트롤러에게 이를 알리기 위해 호출하는 메서드는 무엇인가요?

🔑 키워드: viewDidUnload didReceiveMemoryWarning

  • 뷰컨트롤러의 뷰가 메모리에서 해제될 때 호출되는 viewDidUnload는 Deprecated 되었습니다.
  • iOS 5 이전에는 메모리 부족 상태가 발생하여 현재 뷰 컨트롤러의 뷰가 필요하지 않을 때, 시스템은 뷰가 해제된 후 이 메서드를 호출할 수 있었고, 뷰 컨트롤러가 뷰에 대한 참조를 갖고 있는 경우, 이 메서드를 사용해서 참조를 해제할 수 있었습니다.
  • 하지만 iOS 6 이상에서는 메모리가 부족한 상황이 오면 시스템이 viewDidUnload 대신 didReceiveMemoryWarning 메서드를 호출하여 뷰 컨트롤러에게 메모리 부족을 알립니다.

3. 라이프사이클 각 메서드의 사용 예시?

  • loadView: 뷰컨트롤러에 뷰를 커스텀 뷰로 설정할 때
  • viewDidLoad: 초기 화면 구성
  • viewWillAppear: 화면이 나타날 때마다 수행해야 하는 작업
  • viewDidAppear: 애니메이션, 비디오 / 음악 재생
  • viewWillDisappear: 키보드 숨김처리
  • viewDidDisappear: 리소스 해제

4. navigation controller의 push/pop과 modal present/dismiss를 사용했을 때, 생명주기 차이점

navigation controller로 화면을 push/pop할 때는 기존의 뷰가 가려지고 그 위에 새로운 뷰가 push되는 stack 구조입니다.
그래서 기존의 뷰의 viewWillDisappear -> 새로운 뷰의 viewWillAppear, viewDidAppear -> 기존 뷰의 viewDidDisappear가 호출되는 방식으로 뷰가 그려집니다.

modal로 화면을 present 할 때에는 기존의 뷰가 사라지는 것이 아니라 그 위에 새로운 뷰가 보여지기 때문에 첫번째 뷰컨트롤러의 viewWillDisappear와 viewDidDisappear 메서드가 호출되지 않습니다.


출처

https://developer.apple.com/documentation/uikit/uiviewcontroller
https://jcsoohwancho.github.io/2019-09-21-iOS-뷰컨트롤러의-생명주기/
https://zeddios.tistory.com/43

0개의 댓글