Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
Tags
- struct
- escaping
- class
- IOS
- self
- viewlifecycle
- ScrollView
- Observer
- 고차함수
- Switch
- http
- Refresh
- segue
- error
- array
- apns
- SWIFT
- NotificationCenter
- 글또
- 화면전환
- PushNotification
- list
- protocol
- SWIFTUI
- calendar
- mvvm
- Animation
- singleton
- Git
- uikit
Archives
- Today
- Total
seong_hye, the developer
UIKit) View Life Cycle 본문
📘UIKit - View Life Cycle (뷰 생명주기)
UIKit에서의 View Life Cycle은 UIViewController가 화면에 나타나고 사라질 때
어떤 메서드 순서로 호출되는 지를 의미한다.
🔹 전체 흐름
🔍일반적인 호출 순서 (화면이 나타날 때)
init() // 생성자 (코드에서 직접 호출 시)
|
loadView() // 뷰 계층을 생성 (직접 구현 가능)
|
viewDidLoad() // 뷰가 메모리에 로드도니 직후 (1회만 호출)
|
viewWillAppear() // 뷰가 나타나기 직전 (매번 호출)
|
viewDidAppear() // 뷰가 화면에 나타난 직후 (매번 호출)
🔍 화면이 사라질 때
viewWillDisappear() // 뷰가 사라지기 직전
|
viewDidDisappear() // 뷰가 사라진 직후
🔹 메서드 역할
메서드 | 설명 | 호출 시점 |
init() | VC 인스턴스 생성자 | 코드에서 직접 생성 시 |
loadView() | view 속성 수동 생성 시 오버라이드 (일반적으로 안 씀) | 내부적으로 한 번만 |
viewDidLoad() | 뷰가 메모리에 로드된 직후 초기화 코드 작성 | 한 번만 호출됨 |
viewWillAppear() | 화면에 나타나기 직전 | 매번 호출됨 |
viewDidAppear() | 화면에 완전히 나타난 후 (애니메이션 끝난 후) | 매번 호출됨 |
viewWillDisappear() | 뷰가 사라지기 직전 | 페이지 전환, pop 등 |
viewDidDisappear() | 뷰가 사라진 직후 | 필요 시 리소스 해제 등 |
🔹 메서드 사용 예시
[뷰 처음 생성]
-> viewDidLoad()
[화면 보여줄 때]
-> viewWillAppear()
-> viewDidAppear()
[화면 사라질 때]
-> viewWillDisappear()
-> viewDidDisappear()
메서드 | 사용 예 |
viewDidLoad() | 초기 UI 구성, 초기 데이터 로딩, tableView setup 등 |
viewWillAppear() | 화면 진입 직전마다 새로고침, 권한 체크, 애니메이션 준비 |
viewDidAppear() | 애니메이션 시작, 자동 포커싱, 트래킹 시작 |
viewWillDisappear() | 네트워크 정지, 애니메이션 중지 |
viewDidDisappear() | 리소스 해제, 타이머 제거 등 |
🔹 viewDidLoad vs viewWillAppear
항목 | viewDidLoad | viewWillAppear |
호출 횟수 | 1회 | 여러 번 (화면 들어올 때마다) |
타이밍 | 뷰가 메모리에 로드될 때 | 뷰가 화면에 나타나기 직전 |
용도 | 초기 설정 | 매번 새로 갱신 필요한 처리 |
🔹 탭 전환 시 생명주기 흐름
UITabBarController로 탭 전환 시 생명주기는 어떻게 변할까
상황 | 호출되는 메서드 |
앱 최초 실행 (첫 탭 VC만 로딩) | viewDidLoad() + viewWillAppear() + viewDidAppear() |
탭 전환 시 (다른 VC로 이동) | viewWillDisappear() / viewDidDisappear() -> 새 VC의 viewWillAppear() / viewDidAppear() |
이미 로딩된 VC로 다시 전환 | viewDidLoad()는 호출되지 않음 ( 한 번만 호출됨 ) |
✅ 탭 1번 뷰 -> 탭 2번 뷰로 전환 시
탭 1번 ViewController | 탭 2번 ViewController | |
viewWillDisappear() | ||
viewDidDisappear() | ||
viewWillAppear() | ||
viewDidAppear() |
✅ 탭 2번 뷰 -> 탭 1번 뷰로 다시 전환 시
- 탭 1번 뷰는 이미 메모리에 있음 -> viewDidLoad()는 호출되지 않음
- 대신 다시 나타남에 따라 생명주기가 달라짐
탭 2번 ViewController | 탭 1번 ViewController | |
viewWillDisappear() | ||
viewDidDisappear() | ||
viewWillAppear() | ||
viewDidAppear() |
🔍 주의할 점
항목 | 설명 |
네트워크 재호출 | viewDidLoad()에만 쓰면 탭 전환 시 갱신 안됨 -> viewWillAppear()에 작성해야 함 |
리소스 누수 | viewWillDisappear()나 viewDidDisappear()에 타이머/애니메이션 정지 필수 |
애니메이션/UI 리셋 | viewWillAppear()에서 매번 새로 설정 가능 |
🔹 push / pop으로 화면전환 시 생명주기 흐름
동작 | 의미 |
push | 현재 화면 위에 새로운 VC를 스택에 추가 (forward navigation) |
pop | 스택에서 현재 VC를 제거하고 이전 VC로 돌아감 (back navigation) |
🔍 push 했을 때 생명주기 호출 순서
navigationController?.pushViewController(SecondViewController(), animated: true)
이전 VC (FirstViewController) | 새 VC (SecondViewController) | |
1. viewWillDisappear() | 2. viewDidLoad() (최초 1회) | |
3. viewWillAppear() | ||
4. viewDidDisappear() | 5. viewDidAppear() |
First.viewWillDisappear()
Second.viewDidLoad()
Second.viewWillAppear()
First.viewDidDisappear()
Second.viewDidAppear()
🔍 pop 했을 때 생명주기 호출 순서
navigationController?.popViewController(animated: true)
사라지는 VC (SecondViewController) | 돌아오는 VC (FirstViewController) | |
1. viewWillDisappear() | 2. viewWillAppear() | |
3. viewDidDisappear() | 4. viewDidAppear() |
Second.viewWillDisappear()
First.viewWillAppear()
Second.viewDidDisappear()
First.viewDidAppear()
'IOS > UIKit' 카테고리의 다른 글
Swift) UIActivityViewController에 대해 알아보기 (ShareSheet) (0) | 2022.11.06 |
---|---|
UIKit) UICollectionvView - layout vs flowlayout (0) | 2022.11.06 |
Swift)SnapKit에 대해 알아보기 (0) | 2022.10.24 |
UIKit) AppDelegate & SceneDelegate 알아보기 (0) | 2022.10.19 |
Swift) 문법 정리 - 생성자 (0) | 2022.08.02 |
Comments