[iOS] ViewController의 Life Cycle(생명주기)

2023. 2. 24. 04:34iOS/iOS

728x90
반응형

👉 ViewController

뷰컨트롤러란 사용자 인터페이스를 관리하고 화면에 내용을 표시하는 데 사용되는 객체이다.

앱의 로직과 데이터를 조정하고 화면에 표시되는 내용을 관리한다.

뷰컨트롤러는 생명주기를 따르며 화면의상태변화에 따라 적절한 메소드를 호출하여 초기화, 데이터로딩, 화면전환, 리소스 해제 등을 관리한다.

뷰컨트롤러는 iOS앱의 핵심 구성요소 중 하나이며, 사용자 인터페이스와 앱의 동작을 관리하는 중요한 역할을 수행한다.

✔️ 역할 수행

  • 화면 관리 : 앱의 각 화면을 담당하며 해당 화면의 뷰 계층 구조를 관리한다. 뷰컨트롤러는 화면의 모양과 동작을 결정하고 사용자 인터페이스 요소들을 관리하며 데이터와 뷰를 연결한다.
  • 상태 관리 : 뷰컨트롤러는 화면 전환과 같은 상태변화에 대응하여 적절한 동작을 수행한다. 예를 들어 다른 화면으로 이동할 때 데이터를 전달하거나 화면이 백그라운드로 들어갈 때 데이터를 저장하는 등의 작업을 수행한다.
  • 이벤트 처리 : 뷰컨트롤러는 사용자의 입력에 응답하고 이벤트를 처리하는 역할을 한다. 버튼 탭, 제스처, 키 입력 등의 이벤트를 감지하고 해당 이벤트에 대한 적절한 동작을 수행한다.
  • 뷰 전환 : 뷰컨트롤러는 앱 내에서 다른 화면으로의 전환을 담당한다. 다른 뷰컨트롤러를 생성하고 해당 뷰컨트롤러의 뷰를 화면에 표시하거나 숨기는 작업을 수행한다.

 

👉 생명주기 (LifeCycle)

생명주기란 앱이 실행되고 종료될 때까지의 전체 과정을 의미한다.

앱이 백그라운드에서 실행 중이거나 화면에 표시되는 동안의 상태 변화를 다루며, 이를 통해 앱의 초기화 실행, 종료, 백그라운드 동작 등을 관리할 수 있다.

 

👉 ViewController의 Life Cycle(생명주기)

뷰컨트롤러의 라이프사이클은 뷰컨트롤러 객체의 생성, 표시, 해제와 관련된 메소드들의 시퀀스이다.

이 메소드들은 iOS 앱에서 화면의 상태변화에 따라 호출된다.

 

 

 

✔️ Init

뷰컨트롤러 객체가 생성된다. 이 단계에서는 메모리 할당 및 초기설정 작업이 수행된다.

이 후 loadView() 메소드가 호출된다.

 

✔️ loadView

뷰 계층 구조가 메모리에 로드된다. 뷰 계층 구조를 생성하고 초기화한다.

만약 인터페이스빌더에서 뷰컨트롤러를 구성한 경우 loadView 대신 viewDidLoad 메소드가 호출된다.

스토리보드통해 뷰를 생성하거나 초기화하는 경우에는 loadView 메소드를 재정의해서는 안된다.

그 이유는 스토리보드에서 뷰를 자동으로 로드하기 때문이다. 스토리보드는 인터페이스 빌더로서 시각적으로 뷰 계층 구조를 구성하고 설정할 수 있는 도구이다. 스토리보드를 사용하면 뷰컨트롤러와 관련된 뷰 계층 구조가 자동으로 로드되어 메모리에 생성되기 때문에 loadView 메소드를 통해 수동으로 생성할 필요가 없다.

loadView 메소드를 재정의하면 스토리보드에서 자동으로 로드되는 뷰 계층 구조가 무시되고 새로운 뷰계층 구조를 수동으로 생성해야하는 문제가 발생할 수 있다.

대신 스토리보드를 사용하여 뷰를 초기화하는 경우에는 viewDidLoad 메소드를 활용하여 초기 작업을 수행하느 것이 일반적이다.

뷰를 커스텀하여 생성하였다면 loadView 메소드를 재정의해서 커스텀한 뷰를 할당한다.

 

✔️ viewDidLoad

뷰의 계층구조가 메모리에 로드된 후 호출되는 메소드이다.

이 메소드는 스토리보드나 인터페이스 빌더를 통해 뷰 계층 구조가 자동으로 로드된 경우 호출된다.

뷰컨트롤러가 자신의 뷰를 로드하고 초기화한 후 뷰에 대한 추가적인 설정작업을 수행하는 데에 사용된다.

▶️ 작업 수행

  • 뷰초기화 : 뷰 계층 구조가 로드된 후 호출되기 때문에 해당 뷰를 초기화하는 작업을 수행하기에 적합한 시점이다.
    예를 들어 서브뷰의 추가, 레이아웃 설정, 배경색 변경 등의 초기화 작업을 수행할 수 있다.
  • 데이터 로딩 : 뷰가 로드된 후에는 필요한 데이터를 로드하거나 데이터 모델과의 연결을 설정할 수 있다. 이를 통해 뷰에 표시할 데이터를 준비하고 데이터와 뷰를 연동시킬 수 있다.
  • 인터페이스 구성 : 사용자 인터페이스 요소들을 구성하고 초기설정을 수행할 수 있다.
    예를 들어 버튼에 액션 메서드를 연결하거나, 텍스트필드의 델리게이트를 설정하는 등의 작업을 수행할 수 있다.
  • 기타 초기설정 : 기타 초기설정 작업을 수행할 수 있다.
    예를 들어 특정 값들의 초기화, 관련 객체들의 설정, 애니메이션 효과 등을 처리할 수 있다.
이 메소드는 생명주기에서 한 번만 호출되며 이후에는 다시 호출되지 않는다.
뷰컨트롤러의 초기화와 초기설정작업을 수행하는 데에 활용된다.

뷰 계층구조가 로드된 후의 작업을 처리해야된다.
만약 뷰 계층구조를 수동으로 생성하는 경우에는 loadView 메소드를 재정의하여 해당 작업을 처리해야 한다.

 

✔️ viewWillAppear

뷰가 화면에 나타나기 직전에 호출된다. 뷰가 나타나기 전에 필요한 작업을 수행할 수 있다.

▶️ 작업 수행

  • 뷰업데이터 : 뷰가 화면에 나타나기 직전에 호출되기 떄문에 뷰에 표시할 데이터를 업데이트하거나 뷰 계층을 다시 그리는 등의 작업을 수행할 수 있다. 뷰가 화면에 나타나기 전에 최신 데이터를 표시하거나 뷰의 레이아웃을 조정할 수 있다.
  • 뷰 애니메이션 : 뷰가 서서히 나타나는 페이드인 효과나 슬라이드 애니메이션을 적용할 수 있다.
  • 뷰 설정 : 네비게이션 바의 속성을 설정하거나, 특정요소의 가시성을 변경하는 등의 작업을 수행할 수 있다.
  • 뷰 상태 초기화 : 이전 상태에서 변경된 내용을 초기화하거나, 사용자의 입력에 따라 동적으로 변경된 상태를 복원하는 등의 작업을 수행할 수 있다.

이 메소드는 다른 뷰컨트롤러로부터 돌아올 때도 호출될 수 있으므로 화면 전환 이후에 필요한 업데이트 작업을 수행하는 데 활용한다.

이 메소드는 뷰컨트롤러의 생명주기에서 여러 번 호출될 수 있으며 다른 뷰컨트롤러와의 화면 전환과 관련된 동작을 처리하는 데에 활용된다.

 

✔️ viewWillLayoutSubviews

뷰의 하위뷰들이 레이아웃되기 직전에 호출되는 메소드이다.

이 메소드는 뷰 계층 구조가 변경되거나 레이아웃 조정되어야 할 때 필요한 작업을 수행하는 데에 사용된다.

▶️ 작업 수행

  • 오토 레이아웃 작업 : 오토 레이아웃을 사용하는 경우, 뷰의 크기나 위치가 변경될 때 이 메소드에서 해당 레이아웃 작업을 수행할 수 있다. 이 메소드에서 하위 뷰들의 크기와 위치를 조정하거나 제약조건을 업데이트하는 등의 작업을 수행할 수 있다.
  • 하위 뷰의 프레임 조정 : 특정 조건에 따라 하위 뷰의 가시성을 변경하거나, 뷰 간의 간격을 조정하는 등의 작업을 수행할 수 있다.
  • 다이나믹한 레이아웃 조정 : 디바이스의 회전, 스플릿 뷰컨트롤러의 상태 변화 등 다이나믹한 레이아웃 변화에 대응하는 작업을 할 수 있다.
뷰의 레이아웃이 변경되지 직전에 호출되기 때문에 레이아웃 작업을 수행하는 데에 적합한 시점이다.
그러나 이 메소드에서 뷰의 레이아웃을 직접 변경하는 것보다는 오토 레이아웃이나 제약조건을 활용하여 뷰를 구성하는 것이 권장된다.

뷰계층구조가 변경될때마다 호출되므로 불필요한 레이아웃 작업이 반복되지 않도록 주의해야 한다.
성능상의 이유로 필요한 경우에만 해당 메소드를 활용해야 한다.

 

✔️ viewDidLayoutSubviews

뷰의 하위뷰들이 레이아웃된 후 호출되는 메소드이다.

이 메소드는 뷰의 레이아웃이 완료된 후에 필요한 작업을 수행하는 데에 사용된다.

▶️ 작업 수행

  • 오토 레이아웃 완료 : 오토 레아이웃이 완료된 후 추가적인 작업을 수행할 수 있다. 뷰의 크기와 위치가 최종적으로 결정된 후에 필요한 작업을 수행할 수 있다.
  • 하위 뷰의 최종 조정 : 레이아웃에 따라 하위뷰의 크기나 위치를 조정하거나, 특정 뷰의 애니메이션 효과를 적용하는 등의 작업을 수행할 수 있다.
  • 레이아웃 완료 이후 작업 : 뷰의 레이아웃이 완료된 후에 추가적인 작업을 수행할 수 있는 시점이다. 화면 회전이후에 뷰의 구성을 업데이트 한다거나, 레이아웃 변화에 따른 데이터 갱신의 작업을 수행할 수 있다.
뷰의 레이아웃이 완료된 후에 호출되기 때문에 뷰의 최종 상태에 따라 동작을 처리하는 데에 유용하다.

뷰계층구조가 변경될때마다 호출되므로 불필요한 레이아웃 작업이 반복되지 않도록 주의해야 한다.

 

✔️ viewDidAppear

뷰가 화면에 완전히 나타난 후 호출되는 메소드이다.

이 메소드는 뷰가 화면에 나타난 직후에 필요한 작업을 수행하는 데 사용된다.

▶️ 작업 수행

  • 데이터 로드 및 업데이트 : 네트워크 요청을 통해 데이터를 가져오거나 데이터베이스에서 정보를 쿼리하여 화면에 표시하는 등의 작업을 수행할 수 있다.
  • 애니메이션 및 효과 추가 : 화면 전환 시에 페이드인 효과나 슬라이드 애니메이션을 적용하는 등의 작업을 수행할 수 있다.
  • 외부 인터페이스와의 상호작용 : 사용자의 입력을 감지하고 처리하거나 외부 서비스와의 연결을 설정하는 등의 작업을 수행할 수 있다.
  • 화면 갱신 : 이전 상태에서 변경된 내용을 반영하거나 다른 뷰컨트롤러로부터 돌아왔을 때 화면을 갱신하는 등의 작업을 수행할 수 있다.
뷰가 완전히 나타난 후에 호출되기 때문에
화면에 대한 최종 조정 작업이나 사용자와의 상호작용을 처리하는 데에 적합한 시점이다.

 

✔️ viewWillDisappear

뷰가 화면에서 사라지기 직전에 호출되는 메소드이다.

뷰가 화면에서 사라지기 전에 필요한 작업을 수행하는 데 사용된다.

▶️ 작업 수행

  • 데이터 저장 : 현재 화면에서 작성한 내용을 저장하거나 수정한 데이터를 데이터베이스에 업데이트 하는 등의 작업을 수행할 수 있다.
  • 상태 관리 : 다른 화면으로 이동하기 전에 현재 상태를 저장하거나 사용자 환경 설정을 업데이트하는 등의 작업을 수행할 수 있다.
  • 사용자 인터페이스 갱신 : 다른 화면으로 이동하기 전에 버튼의 활성화 상태를 변경하거나 애니메이션 효과를 추가하는 등의 작업을 수행할 수 있다.
  • 사용자 입력제어 : 특정 조건을 확인하여 화면 전환을 중단하거나 경고메시지를 표시하는 등의 작업을 수행할 수 있다.
뷰가 화면에서 사라지기 직전에 호출되기 때문에 화면 전환 전에 필요한 작업을 처리하는 데에 적합한 시점이다.

이 메소드에서는 현재 화면에 대한 정리작업이나 변경사항의 저장등을 수행할 수 있다.

 

✔️ viewDidDisappear

뷰가 화면에서 완전히 사라진 후 호출되는 메소드이다.

뷰가 화면에서 사라진 후에 필요한 작업을 수행하는 데에 사용된다.

▶️ 작업 수행

  • 리소스 해제 : 메모리 관리를 위해 할당된 객체들을 해제하거나 관리중인 리소스를 해제하는 등의 작업을 수행할 수 있다.
  • 타이머 정지 : 화면이 보이지 않을 때는 불필요한 타이머 동작을 중지시키는 등의 작업을 수행할 수 있다.
  • 상태 저장 : 다른 화면으로 이동하기 전에 현재 상태를 저장하거나 사용자 환경 설정을 업데이트 하는 등의 작업을 수행할 수 있다.
  • 사용자 피드백 : 화면 전환 후에 알림 메시지를 표시하거나 다음 동작을 안내하는 등의 작업을 수행할 수 있다.
뷰가 화면에서 완전히 사라진 후에 호출되기 때문에 화면 전환 이후의 정리 작업이나 사용자에게 피드백을 제공하는 데에 적합한 시점이다.
이 메소드에서는 이전 화면에 대한 리소스 해제, 상태 저장 등을 수행할 수 있다.

 

 


👉 ViewController의 생명주기 메소드 호출

 

 

✔️  앱을 처음 실행했을 때


 

 

✔️  NavigationController : push 를 이용한 화면 전환


처음 화면

push 버튼을 눌렀을 때

뒤로가기 버튼을 눌렀을 때

 


push 버튼을 눌렀을 때


뒤로가기 버튼을 눌렀을 때
   
  • 네비게이션 컨트롤러는 스택처럼 뷰가 쌓인다.
  • push버튼을 눌렀을 때 (탭 1뷰 -> push 뷰 화면전환)
    1. push 뷰의 viewDidLoad() 가 호출되면서 -> push 가 메모리에 처음 올라간다.
    2. 탭1 뷰의 viewwillDisappear() 이 호출된다. -> 탭1 뷰가 사라지기 직전
    3. push 뷰의 viewWillAppear() 이 호출되면서 -> push 뷰가 화면에 나타나기 직전
    4. 탭1 뷰의 viewDidDisappear() 이 호출되면서 탭1 뷰가 사라진다. -> 탭1 뷰가 사라진 직후
    5. 탭1 뷰가 사라지면 push 뷰의 viewDidAppear() 이 호출되고 화면이 나타난다. -> push 뷰가 나타난 직후

 

  • 네비게이션의 뒤로가기 버튼을 눌렀을 때 (push 뷰 -> 탭1 뷰 화면전환)
    1. push 뷰의 WillDisappear() -> 탭1 뷰의 WillAppear() -> push 뷰의 DidDisppear() -> 탭1 뷰의 DidAppear() 순으로
    2. push 뷰가 사라지기 시작하면서 탭1 뷰가 나타나기 시작하고 push 뷰가 사라지면 탭1 뷰가 나타난다.

 

 

✔️  modal 를 이용한 화면 전환


처음 화면

modal 버튼을 눌렀을 때

화면을 밑으로 내렸을 때

 


modal 버튼을 눌렀을 때


화면을 밑으로 내렸을 때
   
  • modal을 이용한 화면전환은 루트 뷰컨트롤러(탭1 뷰)의 화면을 그대로 유지하고 위에 새로운 화면을 쌓는다.
  • push를 이용한 화면전환과 다르게 modal의 화면이 호출되어도 탭1 뷰의 생명주기는 호출되지 않는다.

 

push 와 Full Screen 을 이용한 화면전환의 경우 루트 뷰컨트롤러의 화면이 사라진다. (메모리가 해제되는 것이 아니라 보이지 않는 것)
하지만 modal, Over Full Screen, Over Current Context는 루트 뷰컨트롤러의 화면이 뒤에 있는 상태로 새로운 화면이 위에 올라온다.

 

 

 

✔️ present를 이용한 화면 전환

처음화면 present 버튼 눌렀을 때 닫기 버튼 눌렀을 때
  • present는 화면을 전환하는 방식이 modal 과 비슷하지만 생명주기 호출은 아예 다르다. push 와 더 비슷하다.
  • modal은 이전 화면이 위에 조금 보이면서 완전히 사라지는 것이 아니고 
    present는 이전 화면이 완전히 가려져 사라지는 것이다.
  • 따라서 프리젠트 뷰가 나타나면서 탭1 뷰는 DidDisappear 이 호출된다.

 

 

 

✔️  탭바컨트롤러의 화면 전환


처음 화면

탭2 버튼 눌렀을 때

탭1으로 갔다가 다시 탭2 뷰로 화면 전환

 


탭2 버튼 눌렀을 때





탭1으로 갔다가 다시 탭2 뷰로 화면 전환
  • 탭바컨트롤러는 다른 화면으로 전환되더라도 메모리에서 해제되지 않기떄문에
    처음 화면을 생성했을 때만 viewDidLoad() 가 호출되면서 메모리에 할당된다.
  • 다른 화면 전환은 화면이 생성될 때마다 viewDidLoad() 가 호출되면서 WillAppear() 이 호출된다.

 

 


📂 정리

loadView

  • 뷰 계층 구조를 메모리에 로드
  • 뷰 계층 구조를 생성하고 초기화
  • 인터페이스 빌더나 스토리보드를 사용한 경우에는 자동으로 로드하기 때문에 사용하지 않음

 

viewDidLoad

  • 뷰 계층 구조가 메모리에 로드된 후 호출
  • 한 번만 호출되며 이 후에는 다시 호출되지 않음

 

viewWillAppear

  • 뷰가 화면에 나타나기 직전에 호출

 

viewDidAppear

  • 뷰가 화면에 나타난 후 호출

 

viewWillDisappear

  • 뷰가 화면에서 사라지기 직전에 호출

 

viewDidDisappear

  • 뷰가 화면에서 사라진 후 호출

 

 

 

 

 

 

 

 

 

[예제 소스코드 깃허브 링크]

https://github.com/HANLeeeee/PracticeTest/tree/main/LifeCycleTest

 

GitHub - HANLeeeee/PracticeTest

Contribute to HANLeeeee/PracticeTest development by creating an account on GitHub.

github.com

 

[참고자료]

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

 

 

 

 

 

728x90
반응형