일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 반응형
- 기초문법
- swift
- 구름톤 유니브
- 대표
- SwiftUI
- async
- WeatherKit
- struct
- collectionview
- 앱개발
- 네트워크
- 프로토콜
- mvc
- Optional
- 옵셔널
- uikit
- GCD
- 실습
- Kingfisher
- 토이프로젝트
- CS
- 이론
- ios
- 세종대학교
- RxSwift
- 학과별커뮤니티
- MVVM
- 스트럭트
- 동시성
- Today
- Total
스윞한 개발자
ViewController의 생명주기(+viewIsAppearing) 톺아보기 본문
안녕하세요! 이번 포스팅에서는 VC의 생명주기에 대해 정리해 보겠습니다.

ViewController의 생명주기는 UIKit으로 개발을 해보신 분들이라면, 대부분이 아는 지식이지만 좀 더 상세히 다뤄보겠습니다.
ViewController의 생명주기를 알아보기 전에, 선행되어야 하는 앱 생명주기에 대해 먼저 간단하게 정리해 보겠습니다.
# 앱 생명주기란?
앱 생명주기는 앱의 전반적인 실행과 종료에 관련된 생명주기입니다.
총 5개의 단계로 이루어져 있으며,
1. Not Running
2. InActive
3. Active
4. Suspended
5. Background
의 단계로 이루어져 있습니다.
iOS 13이 나오기 이전까지는 이 모든 과정을 AppDelegate에서 진행했었습니다. 하지만, MultiWindow 지원과 관련된 기능을 도입했기 때문에 SceneDelegate를 만들어 기존의 기능들을 분산했습니다.
이제 앱이 실행되었을 때! ViewController의 생명주기에 대해 톺아보겠습니다.

먼저 애플 공식문서부터 파해쳐보겠습니다. 아래의 이미지와 같이 VC의 생명주기는 화면이 나타나는, 사라지는 것을 기준으로 나타내고 있습니다.
제가 기본적으로 알고 있었던 생명주기는,
앱이 나타나는
1. ViewWillAppear
2. ViewDidAppear
앱이 사라지는
1. ViewWillDisappear
2. ViewDidDisappear
추가로 앱이 로드되는
ViewDidLoad의 정도로 기본적인 지식이 있었습니다. 오늘은 이 과정과 ViewIsAppearing까지 정리해 보겠습니다.

https://developer.apple.com/documentation/uikit/uiviewcontroller
UIViewController | Apple Developer Documentation
An object that manages a view hierarchy for your UIKit app.
developer.apple.com
1. loadView()
View를 로드하는 과정입니다. 즉, View를 메모리에 올리는 함수입니다.
2. viewDidLoad()
View가 메모리에 올라온 후 호출됩니다. 뷰가 메모리에 올라온 후, 한 번만 호출되며 메모리 해제 시에 ViewDidLoad()는 다시 호출됩니다.
3. viewWillAppear()
View가 화면에 나타나기 전에 호출됩니다. VC가 메모리에 올라올 때, 처음 한 번만 실행되는 ViewDidLoad()와는 다르게 해당 화면을 띄어줄 때마다 호출됩니다.
4. viewDidAppear()
스크린에 뷰가 완전히! 나타난 후에 호출됩니다.
5. viewWillDisappear()
스크린에서 뷰가 사라지기 전(사라지기 시작 -> 완전히 사라지기 전)에 호출됩니다.
6. viewDidDisappear()
스크린에서 뷰가 완전히! 사라진 후에 호출됩니다.
좀 더 상세히 알아보기 위해 실제로 로그를 찍어보겠습니다.


앱을 처음 실행시키면 메모리에 뷰가 로드된 후 최초 1회 viewDidLoad가 호출되며, View가 화면에 나타나기 시작하면서 viewWillAppear가 호출되며 완전히 화면에 나오게 되면서 viewDidAppear가 호출되는 것을 볼 수 있습니다.
첫 번째로, 메모리 해제와 생명주기의 연관성을 알아보기 위해 Show와 Modal에서의 차이를 확인해 보겠습니다.
# Automatic Modal(Present)



Slow Animation을 통해 천천히 로그를 찍어보겠습니다. 먼저, 모달을 통해 View가 화면에 보이기 시작되는 시점에는 viewWillAppear이 찍히게 됩니다. 완전히 view가 화면에 보이게 되면 viewDidAppear를 출력하는 것을 볼 수 있습니다.



view가 사라지기 시작할 때는 viewWillDisappear가 view가 완전히 사라졌을 때는 viewDidappear가 호출되는 것을 확인할 수 있습니다.
# Show(Navigation Push)
이제 show인 경우를 살펴보겠습니다. 화면이 나타나고 사라지는 과정에서 호출되는 메서드는 다 같을 것입니다. 하지만 modal이 될 때는 차이점이 존재합니다.



push 될 때를 살펴보면, modal과는 다르게 처음의 rootView가 사라지기 위해 willAppear과 didAppear를 호출하는 것을 볼 수 있습니다. 이 처럼 메모리에서 완전히 해제가 된다면 즉, 완전히 뷰가 사라지거나 보이게 되는 상황에서의 생명주기와의 관련성을 살펴보았습니다.
리소스가 많이 필요한 MapKit을 활용해서 Memory Report를 살펴보겠습니다.
push가 되었을 때의 메모리는

맵을 보여줘야 하기에 급수적으로 상승한 점을 볼 수 있고, pop을 했을때는

다시 메모리가 해제되는 것을 볼수 있습니다. show 방식과 modal 방식에 대해 차이를 두며, VC의 생명주기에 대해서 알아보았습니다. 하지만 modal 방식도 fullScreen으로 사용하게 된다면 show와 같은 VC 생명주기를 따르게 될 것입니다.
# viewIsAppearing
이제 위의 공식문서 그림에 있었던 viewIsAppearing(WWDC23 공개)에 대해 정리해 보겠습니다.
viewIsAppearing은 시스템이 뷰 컨트롤러의 뷰를 뷰 계층에 추가하고 있음을 뷰 컨트롤러에 알리는 과정입니다.
viewWillAppear와 달리 시스템은 뷰 컨트롤러의 뷰를 뷰 계층에 추가한 후 IsAppearing을 호출하고, superView는 뷰를 배치합니다. 시스템이 호출할 때 뷰 컨트롤러와 뷰 모두 trait collections(가로, 세로 기본적인 화면 특징)을 수신하고 뷰는 정확한 geometry(size, safe Area 등)를 가집니다.
https://developer.apple.com/documentation/uikit/uiviewcontroller/viewisappearing(_:)
viewIsAppearing(_:) | Apple Developer Documentation
Notifies the view controller that the system is adding the view controller’s view to a view hierarchy.
developer.apple.com
viewWillAppear를 호출할 때는 traits, geometry가 최신상태가 아니지만, viewIsAppearing은 최신상태이기 때문에 뷰를 업데이트할 때 사용할 수 있습니다.
결국, viewIsAppearing은 화면의 특징을 기반으로 뷰를 구성하거나 업데이트할 때, 혹은 뷰가 보일 때 컬렉션/테이블 뷰를 scroll Position을 설정할 때 사용할 수 있습니다.
다음에는 viewIsAppearing을 활용한 실습과 다른 더 유익한 내용을 포스팅해보도록 하겠습니다.
감사합니다!

'Swift 이론' 카테고리의 다른 글
코드 사이닝? 프로비저닝 프로파일? 🤔 (1) | 2025.01.05 |
---|---|
옵셔널 내부구조 파해치기!👊🏻 (2) | 2025.01.05 |
Kingfisher 캐싱 톺아보기 (0) | 2025.01.04 |
Saving Data - UserDefault에 대한 정리 (2) | 2025.01.01 |
앱 Thinning (0) | 2024.12.30 |