뷰의 생명주기 (View's Life Cycle)

SeBin·2025년 1월 2일

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랑 똑같이 동작합니다.

0개의 댓글