: View Controller의 생명주기에 대해 알아보고자 한다.
- iOS앱은 ViewController들로 이루어져 있다. (줄여서 VC 라고 적도록 하겠다.)
- 각각의 VC는 생명주기를 가지고 있다.
UIViewController 란?
: An object that manages a view hierarchy for your UIKit app.* For Detail : https://developer.apple.com/documentation/uikit/uiviewcontroller
VC’s Responsibility
- 주어진 데이터의 변화에 대한 응답으로 view들의 contents 업데이트 하기.
- View들과 함께 사용자의 상호작용에 응답한다. (Event Handling)
- View들을 재조정하고, 전반적인 인터페이스 레이아웃을 관리한다.
- (다른 vc들 포함) 다른 오브젝트들과 앱을 구성한다.
Valid State Transitions
- 다음 그림은 vc의 view들의 시각적으로 볼 수 있는 상태들을 보여주고, 상태 변화가 나타날 수 있음을 보여준다.
Life-Cycle Method
: vc 간의 전환이 이루어질 때, 이전 vc의 view가 유지될 수도, 아닐 수도 있다.
혹은, 전환될 vc에서 이전 vc의 정보를 이어받아 작업해야 하는경우도 있다.
→ 위에 나온 view들의 상태에 따라, 해당 시점을 이벤트화 해두어 그 시점에서 해야할 동작을 지정할 수 있다.
init()
- storyboard나 nib 파일을 통해 vc를 초기화 한다.
- view를 만들 때 사용할 정보를 vc에 저장하는 단계이다.
loadView()
- 화면에 띄워줄 view 실제로 생성하여 메모리에 올린다.
- 사용자가 이 메소드를 직접 호출하는 것 권장하지 않음.
( view의 모든 것을 직접코딩하여 만드는 경우를 제외하고는 ovrride하지 않는 것을 권장한다.) - 만약 직접 호출 하는 경우 : storyboard나 nib을 사용하지 않는다면,
이 메소드를 override해서 view를 만들고 view hierarchy를 구성해야 한다. - 현재 view 프로퍼티가 nil 이면서 view 프로퍼티가 요청될 때 vc가 이 메소드를 호출한다.
viewDidLoad()
- vc가 메모리에 로드 된 직후에 호출되며 시스템에 의해 자동으로 호출된다.
- 사용자에게 화면이 보여지기 전에 필요한 행위들을 작성할 수 있다.
- 일반적으로 resource를 초기화하거나, 초기화면을 구성하는 용도로 사용된다.
- vc 생에 딱 1번 호출 된다! → 따라서 딱 1번만 있을 행위에 대해서는 여기 안에 작성해줄 것.
viewWillAppear()
- vc의 화면이 올라오고 난 후, 뷰가 view hierarchy에 추가되기 직전에, 해당 뷰가 나타나기 위한 애니메이션이 설정되기 전에 호출된다.
(뷰가 로드 된 후, 눈에 보이기 전에 컨트롤러에게 알리는 역할) - 이 메소드를 override 할 때는 반드시 부모 클래스의 viewWIllAppear를 호출하도록 정의해야 한다.
- 다른 뷰로 이동했다가 돌아올 때 재호출되는 메소드로, 화면이 나타날 때 마다 수행해야 하는 작업을 정의하기 좋다.
- 화면 전환을 통해 다시 현재 화면으로 돌아올 때는 viewDidLoad()가 아닌 viewWillAppear()이 호출 된다.
viewDidAppear()
- view가 view hierarchy에 추가된 직후에 호출된다.
(view가 데이터와 함께 완전히 화면에 나타난 후 호출되는 메소드.) - 이 메소드를 override해서 나타나는 뷰에 대한 추가적인 설정을 해줄 수 있다.
- 마찬가지로, 반드시 부모 클래스의 viewDidAppear를 호출하도록 정의해야 한다.
- ❗️: 만약 어떤 vc가 다른 vc를 popover 방식으로 띄운다면, popover로 띄워진 vc가 사라질 때 popver로 띄어진 vc에 대해서는 viewDidAppear가 호출되지 않는다.
viewWillDisAppear()
- 다음 vc화면으로 전환하기 위해 view가 view hierarchy에서 제거되기 직전 이나
vc가 사라지기 위한 애니메이션이 설정되기 직전에 호출되는 메소드. - 이 메소드를 override해서 해당 뷰를 통해 일어난 변화를 저장하거나, first responder상태를 내려놓거나, 뷰가 나타났을 때 조정됬던 다른 뷰들을 원래대로 돌려놓는 등의 작업을 수행할 수 있다.
- 마찬가지로, 반드시 부모 클래스의 viewWillDisappear를 호출하도록 정의해야 한다.
- ❗️: 보통 will - did가 쌍으로 호출되지만, 반드시 그런 것은 아니다. 어떤 작업을 제대로 수행하기 위해서는 will-did 쌍 뿐 아니라, 상대쪽 will만이 호출되는 경우도 올바르게 대응해줘야 한다.
viewDidDisAppear()
- view가 view hierarchy에서 제거된 이후에 호출된다.
(vc들이 화면에서 사라지고 나서 호출되는 메소드.) - 이 메소드를 override해서 화면이 사라지고 나서 필요없어지는(혹은 멈춰야하는) 작업들을 여기서 한다.
- 마찬가지로, 반드시 부모 클래스의 viewDidDisAppear()를 호출하도록 정의해야 한다.
deinit()
- vc의 참조가 0이 되면 deinit()을 통해
vc가 가지고 있던 view와 관련 resource들을 해제함으로써 완전히 생명주기가 끝나게 된다.
참고 자료
틀린부분이 있거나, 더 좋은 방법이 있다면 댓글로 남겨주세요!
🌈댓글은 언제나 환영입니다🙏🏻
반응형
'iOS' 카테고리의 다른 글
Push Notification 과 APNS - iOS (0) | 2022.04.14 |
---|---|
[ScrollView] Auto Layout 설정이 어렵다면 이걸 보세요! - iOS (1) | 2021.11.18 |
github에 올리면 안되는 APIKEY 숨기기 - iOS (10) | 2021.10.26 |
랜덤 색상을 쓰고 싶을 때 추가하면 되는 extension - iOS (0) | 2021.10.23 |
Frame / Bounds 의 차이 - Swift (0) | 2021.07.17 |