ViewController의 생명주기
하나의 앱은 하나 이상의 ViewController를 갖게 됩니다.
iOS 앱을 개발할 때 여러 개의 ViewController로 화면에 보여지는 정보를 최신화하는 등, 화면 전환의 특정 시점에서 특별한 작업을 해야할 경우가 있습니다.
이럴 때 뷰의 생명주기가 유용하게 사용할 수 있기 때문에 정리해보았습니다.

0. loadView
뷰를 메모리에 올리는 과정, 뷰를 바꿀 수 있는 시점
- 뷰 컨트롤러에서 루트 뷰를 그리는 메서드입니다.
- 뷰 컨트롤러의 뷰를 직접 코드로 작성한 custom view로 바꾸기 위해 loadView를 재정의할 수 있습니다.
- loadView에서는 뷰를 직접 초기화 해줘야합니다.
- 코드로 직접 뷰 컨트롤러를 그리는 경우에만 사용해야 합니다.
- 스토리보드와 연결되어있다면 재정의할 수 없습니다.
- 재정의할 경우 super를 쓰지 않습니다. super를 쓰면 상위 클래스인 UIView를 로드하기 때문에 custom view로 갈아 끼울 수 없습니다.
1. viewDidLoad
뷰가 로드 됨
- 뷰가 메모리에 완전히 올라온 후, 한 번만 호출됩니다.
- 뷰가 메모리에서 해제되고 다시 올라온다면 또 호출될 수 있습니다.
- 화면을 왔다갔다 하다보면 가끔씩 호출되는걸 보실 수 있습니다.
- 탭바 같은 경우 최초 딱 한 번만 호출되는데, 루트 뷰 컨트롤러로서 계속 탭바에 존재하기 때문에 메모리에서 지우지 않습니다.
2. viewWillAppear
뷰가 뜨기 직전
- 메모리와 상관없이 뷰가 화면에 나타날 때마다 호출됩니다.
- 주로 새로운 데이터로 뷰를 업데이트 해야 할 때 사용합니다.
3. viewIsAppearing
뷰가 뜨기 직전, UI가 그려지는 타이밍
- iOS 13버전부터 사용 가능합니다.
- viewWillAppear와 viewDidAppear 사이에서 호출됩니다.
- 뷰 컨트롤러와 뷰의 배치가 끝난 후 호출됩니다. (뷰의 사이즈, Safe area 등이 정확합니다.)
- transition animation의 첫 프레임에 호출되어 자연스러운 transition이 가능합니다.
- 뷰가 보일 때(appear) UI를 업데이트 하기 위한 최적의 장소입니다.
4. viewDidAppear
뷰가 완벽하게 화면에 나타난 직후
- 화면이 나타난 후에 필요한 작업을 처리할 수 있습니다.
- 화면을 넘길 때 완전히 넘기지 않고 손으로 잡고있으면 호출되지 않습니다.
5. viewWillDisappear
뷰가 사라지기 직전
- 뷰의 애니메이션을 멈추거나 화면이 사라지기 직전에 마쳐야할 작업들을 처리할 수 있습니다.
- 화면을 넘길 때 완전히 넘기지 않고 손으로 잡고있으면 호출되지 않습니다.
6. viewDidDisappear
뷰가 완벽하게 사라진 직후
- 이 때 뷰는 화면에서 사라졌지만 메모리에서 해제된 것은 아닙니다.
화면 전환 별 호출되는 메서드
A 화면에서 B 화면으로 이동한다고 할 때 modal 방식으로 이동하는지, Navigation Controller를 이용한 show 방식으로 이동하는지, 탭바로 이동하는지에 따라 호출되는 메서드가 달라집니다.
1. A 화면 → modal → B 화면
- modal이 sheet 버전이라면 화면 맨 위 뒤쪽에 A 화면이 사라지지 않은걸 보실 수 있습니다.
- 이럴 땐 viewWillDisappear / viewDidDisappear이 실행되지 않습니다.
- fullScreen이라면 A 화면이 완벽하게 가려집니다
- 그러면 viewWillDisappear / viewDidDisappear이 실행됩니다.
- 이는 show와 똑같이 동작합니다.
2. A 화면 → show →B 화면
- A 화면이 완벽하게 사라집니다.
- viewWillDisappear / viewDidDisappear이 실행됩니다.
<SecondWeek.ShowViewController: 0x154f06700> viewDidLoad()
<SecondWeek.PracticeViewController: 0x155c08620> viewWillDisappear(_:)
<SecondWeek.ShowViewController: 0x154f06700> viewWillAppear(_:)
<SecondWeek.PracticeViewController: 0x155c08620> viewDidDisappear(_:)
<SecondWeek.ShowViewController: 0x154f06700> viewDidAppear(_:)
- B 화면 로드 → A 화면 사라지기 직전 → B 화면 뜨기 직전 → A 화면 완전히 사라짐 → B 화면 완전히 나옴 순으로 호출되는걸 확인하실 수 있습니다.
3. A 화면 → 탭바 → B 화면
- A 화면이 완벽하게 사라집니다.
- viewWillDisappear / viewDidDisappear이 실행됩니다.
- modal fullScreen, show랑 똑같이 동작합니다.