뷰컨트롤러의 생명주기
개요
일반적으로 우리가 사용하는 모바일 앱들은 하나 이상의 화면으로 이루어져 있다.
즉, 하나의 앱은 최소 하나 이상의 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 앱의 경우, 화면 전환시에 운영체제에 의해 내부적으로 특정 함수가 호출되는데, 이를 이용하여 화면에 보여지는 정보를 최신화하는 등, 화면 전환의 특정 시점에서 특별한 작업을 해야할 경우 유용하게 사용할 수 있다.