생명주기 (2) [ ViewController 생명주기 ]

2024. 8. 31. 17:15·iOS/UIKit
반응형

 

 

이전 학습은 iOS 앱의 전체적인 생명주기를 봤다면 이번에는 조금 더 작은 단위인
ViewController의 생명주기를 학습할껀데.

 

각 콜밸 함수의 호출 시기와 역할로 구분해서 학습해보자.

 

 


1. loadView

역할

ViewController는 메모리에 올라온 후, 인스턴스 메서드인 loadView()를 통해 화면(view)을 메모리에 올린다.

 

⚠️ 스토리보드(Interface Builder)를 통해 View를 생성 및 초기화하는 경우 loadView() 메서드를 재정의해서는 안된다.

 

만약 view를 수동으로(코드로) 생성했다면 loadView()를 재정의해서
ViewController의 view에 직접 생성한 view를 할당 한다. ( super.loadView() 불필요 )


2. viewDidLoad

호출 시기

- view가 메모리에 올라온 후 호출

 

- 스토리보드의 뷰객체와 ViewController의 코드가 연결된 후 호출

 

- 뷰가 메모리에 올라온 후, 한 번만 호출

역할

view의 추가 초기화를 진행하려면 이 viewDidLoad()를 재정의하여 사용

 

view가 단지 메모리에 올라간 상태이기 때문에
view의 사이즈나 애니메이션과 같이 뷰가 보여진 후 작업은 여기서 하지 않는다.


3. viewWillAppear

호출 시기

- view가 화면에 나타나기 전에 호출된다.

 

- ViewController가 메모리에 올라올 때, 한 번만 실행되는 viewDIdLoad()와 다르게 화면을 띄워줄 때 마다 호출

역할

뷰를 띄울 때마다 특정 처리가 필요하거나, 다른 뷰에서 처리한 작업 결과로 인해 뷰를 업데이트해야 하는 경우에 사용된다.


4. viewDidAppear

호출 시기

- 스크린에 뷰가 나타난 후 호출된다.

역할

뷰의 애니메이션을 시작하거나, 타이머를 시작하는 등 화면이 나타난 후 필요한 작업을 처리한다.


5. viewWillDisappear

호출 시기

- 스크린에서 뷰가 사라지기 전에 호출된다.

역할

진행 중인 애니메이션을 멈추거나, 타이머를 종료시키는 등의 작업을 처리한다.


6. viewDidDisappear

호출 시기

- 스크린에서 뷰가 사라진 후 호출된다.

- 단지 화면이 스크린에서 내려갔을 뿐, 메모리에서 해제된 것은 아니다.

 


추가로 여러 화면 전환 시 호출되는 콜백함수를 검증해보자. 

1. Tab bar

 

다른 화면으로 전환되더라도, 메모리에서 해제되지 않는다.
(TabBarController가 하위의 VC들을 강하게 참조하여 RC를 유지시킨다.)

 

Tab1 -> Tab2 이동

viewDidLoad(Tab 2 첫 load만 호출) -> WillAppear → WillDisappear → DidDisappear → DidAppear

2. NavigationController push

 

push를 사용하여 화면을 전환할 때, 생명주기 함수 호출은 TabBar를 사용한 화면 전환과 동일하지만

pop을 통해 원래의 VC로 돌아올 때, ViewController가 메모리에서 해제되어 deinit이 호출된다.

 

다시 push 하여 VC를 전환하면 viewDidLoad()가 호출된다.

 

push

init -> DidLoad → WillDisappear → WillAppear → DidDisappear → DidAppear

 

Pop

WillDisappear → WillAppear → DidDisappear → DidAppear → deinit

 


3. Modal

modal은 modalPresentationStyle에 따라 호출 순서가 달라진다. 

a) Style: 기본값, Page Sheet, Form Sheet

 

기존 ViewController를 완전히 덮지 않는 Presentation 설정의 경우,modal로 띄우는
ViewController에 대한 생명주기 함수만 호출되었다.

present

didLoad → WillAppear → DidAppear

 

dismiss

WillDisappear → WillAppear → DidDisappear → DidAppear → deinit

 

 

b) Style:  Full Screen

 

Full Screen 설정의 경우, 루트 뷰 컨트롤러를 완전히 덮기 때문에 push를 사용한 뷰 전환과
마찬가지로 이전 ViewController의 생명주기 함수도 같이 호출된다.

 

present

init -> DidLoad → WillDisappear → WillAppear → DidAppear → DidDisappear

 

dismiss

WillDisappear → WillAppear → DidDisappear → DidAppear → deinit

 

c) Style:  Over Full Screen, Over Current Context

 

두 modal 스타일은 분명 루트 뷰 컨트롤러를 완전히 덮는데도 modal 기본값
설정처럼 루트 뷰 컨트롤러의 생명주기 함수가 호출되지 않는다.

 

이유는 이름에서 알 수 있듯이 루트 뷰 컨트롤러의 화면 위에 Over해서 화면을 쌓기 때문이다.

 

present

DidLoad → WillAppear → DidAppear

 

dismiss

WillDisappear → DidDisappear → deinit

참고 

생명주기

 

반응형

'iOS > UIKit' 카테고리의 다른 글

생명주기 (4) [ 업데이트 Cycle ]  (2) 2024.09.01
생명주기 (3) [ View 생명주기 ]  (1) 2024.09.01
UIKit 코드 베이스 셋팅  (0) 2024.09.01
생명주기 (1) [ iOS 앱 생명주기, Scene 생명주기 ]  (3) 2024.08.31
UIResponder Chain  (1) 2024.08.30
'iOS/UIKit' 카테고리의 다른 글
  • 생명주기 (3) [ View 생명주기 ]
  • UIKit 코드 베이스 셋팅
  • 생명주기 (1) [ iOS 앱 생명주기, Scene 생명주기 ]
  • UIResponder Chain
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (305) N
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (38) N
        • swift (32)
        • python (5) N
        • Kotlin (1)
      • iOS (132)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (32)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (13)
        • 어노테이션 (1)
        • 튜토리얼 (11)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (0)
        • 이론 (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    protocol
    CS
    dp
    lifecycle
    투포인터
    dispatch
    Tuist
    UIKit
    boostcamp
    IOS
    SwiftUI
    dfs
    Spring
    Swift
    GIT
    백준
    프로그래머스
    property
    AVFoundation
    concurrency
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
생명주기 (2) [ ViewController 생명주기 ]
상단으로

티스토리툴바