seong_hye, the developer

UIKit) View Life Cycle 본문

IOS/UIKit

UIKit) View Life Cycle

seong_hye 2022. 10. 26.

 

📘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()

 

Comments