Search
Duplicate

뷰컨트롤러의 생명주기

생성일
2023/07/02 14:25
태그
LifeCycle

뷰컨트롤러의 생명주기

개요

일반적으로 우리가 사용하는 모바일 앱들은 하나 이상의 화면으로 이루어져 있다.
즉, 하나의 앱은 최소 하나 이상의 ViewController를 갖고 있다는 것이다.
이 뷰컨트롤러는 각각의 뷰컨트롤러마다 생명주기를 가지고 있다.
생명주기는 각각의 뷰 컨트롤러가 화면에 나타나거나 사라질 때, 즉 화면이 전환될 때 호출되는 함수들을 의미한다.

ViewController의 생명주기

loadView

loadView는 뷰를 메모리에 올리는 과정으로, 뷰를 바꿀 수 있는 시점이다.
뷰컨트롤러가 메모리에 올라온 후, 인스턴스 메서드인 loadView를 호출함으로써 화면을 메모리에 올리게 된다.
각 뷰컨트롤러는 기본적으로 default view를 가지고 있는데, 뷰 컨트롤러의 뷰를 직접 코드로 작성한 custom view로 바꾸기 위해 loadView 메서드를 재정의 할 수 있다.
이때, 유의할 점은
1.
뷰컨트롤러와 연결된 스토리보드가 있다면 해당 스토리보드에서 뷰를 로드 해야한다.
→ 스토리보드를 통해 뷰를 생성하거나 초기화하는 경우는 loadView 메서드를 재정의해서는 안된다는 의미이다.
→ 뷰컨트롤러와 연결된 스토리보드가 있는 상태에서 loadView 메서드를 재정의할 경우, 스토리보드가 무시되어 화면에 아무것도 나오지 않게 되기 때문이다.
2.
loadView 메서드를 재정의할 때는 super를 사용하지 않는다.
→ loadView 메서드를 재정의할 경우, 메서드 내부에서 super.loadView를 하지 않는다.
→ 정확하게 loadView 메서드의 내부 동작을 알 수는 없지만, loadView 메소드를 재정의할 경우, 어차피 super.loadView의 기본 동작이 무시되기 때문으로 보인다.

viewDidLoad

viewDidLoad는 뷰가 생성되었을 때, 즉 뷰가 메모리에 완전히 올라온 후, 한번만 호출된다,
단, 뷰가 메모리에서 해제된 후에 다시 메모리에 올라온다면, 그 때는 다시 호출될 수 있다.
주로, 뷰의 추가 초기화를 진행하기 위해 재정의하여 사용한다.
뷰가 메모리에 올라올 때, 딱 한번만 실행되므로, 처음 한번만 실행하면 되는 코드를 작성한다.
일반적으로는 뷰 객체의 추가 초기화 내용을 담은 함수를 별도로 작성한 후, viewDidLoad에서 해당 메소드를 호출하는 방식으로 많이 사용한다.

viewWillAppear

viewWillApear는 뷰가 실제 화면에 나타나기 직전에 호출된다.
viewDidLoad가 메모리에 올라온 후, 한번만 호출되는 것과 다르게, 메모리와 상관없이 다른 뷰 컨트롤러를 보다가 다시 돌아오는 등 뷰가 화면에 나타날 때마다 호출된다.
주로 뷰를 띄울 때마다 특정 처리가 필요하거나, 다른 뷰에서 처리한 작업 결과로 뷰를 업데이트 해야하는 경우, 즉 화면 갱신이 필요한 경우에 사용한다.
예를들면, 카톡의 특정 채팅방에서 채팅을 한 후, 채팅방 목록으로 나왔을 때, 마지막으로 채팅한 내용을 채팅방 목록에 보여주거나, 기차 좌석 예약 앱에서 좌석을 예약한 후에 좌석 정보를 업데이트해서 화면에 보여줄 때 등이 있다.

viewDidAppear

viewDidAppear는 뷰가 실제 화면에 나타난 직후에 호출된다.
뷰의 애니메이션을 시작하거나, 타이머를 시작하는 등 화면이 나타난 후에 필요한 작업을 처리할 때 사용한다.

viewWillDisappear

viewWillDisappear는 뷰가 화면에서 사라지기 직전에 호출된다.
뷰의 애니메이션을 멈추거나, 타이머를 멈추는 등 화면이 사라지기 직전에 마쳐야 할 작업들을 처리할 때 사용한다.

viewDidDisappear

viewDidDisappear는 뷰가 화면에서 사라진 직후 호출된다.
이때, 뷰는 화면에서 사라진 것일 뿐, 메모리에서 해제된 것을 의미하지는 않는다.

ViewController의 생명주기라는 개념이 왜 필요할까?

지금까지 뷰컨트롤러의 생명주기에 대해 알아봤는데, 그렇다면 이러한 생명주기라는 개념은 왜 필요한 것일까?
iOS 앱의 경우, 화면 전환시에 운영체제에 의해 내부적으로 특정 함수가 호출되는데, 이를 이용하여 화면에 보여지는 정보를 최신화하는 등, 화면 전환의 특정 시점에서 특별한 작업을 해야할 경우 유용하게 사용할 수 있다.

ref)