뚝딱뚝딱 모바일

[iOS] ViewController Lifecycle에 대해 알아보자 본문

iOS 지식

[iOS] ViewController Lifecycle에 대해 알아보자

규석 2023. 3. 18. 08:27

안녕하세요!.

이번엔 iOS ViewController Lifecycle에 대해 알아보겠습니다.


ViewController Lifecycle이란?

ViewController(이하 VC) Lifecycle, 뷰컨트롤러의 생명주기라고도 합니다.

말 그대로 뷰컨트롤러가 만들어지고부터 없어지기까지의 주기를 말합니다.

모든 앱은 하나 이상의 VC로 구성되어 있고, 이 VC들은 각각의 생명주기를 가지고 있으니, 우리는 생명주기들을 고려하며 코드를 짜야 됩니다. 그 이유에 대해서 이제 알아봅시다.

 

이미지를 퍼올려다... 그냥 하나 만들었습니다

간단하게 도식화해서 만들어보았는데, 하나하나 설명해 드리겠습니다.

1. loadView

뷰를 요청받았는데, 뷰 Nil이면, 즉 존재하지 않으면 뷰컨트롤러가 호출하는 함수입니다.

뷰를 만들어 메모리에 올리는 역할을 합니다. Apple Developer Docs를 참고하면 직접적으로 불러서는 안 된다고 합니다.

 

2. viewDidLoad

여러분들이 자주 봤을 생명주기 함수입니다. Xcode에서 UIViewController 파일을 만들게 되면 자동으로 생성해 주는 함수죠.

이걸 보고 유추해서 '초기 작업은 이 친구로 하는건가?' 라는 생각이 드셨다면 정답입니다.

이 함수는 뷰가 메모리에 로드가 완료되면 호출됩니다. 화면이 처음 만들어질 때 딱 한 번만 호출되기에 처음 한번만 실행되어야 하는 초기화 코드가 있을 경우 이 함수에서 작업하면 됩니다.

 

3. viewWillAppear

뷰를 화면에 보여주기 직전에, 그리고 뷰의 애니메이션이 구성되기 전에 호출되는 함수입니다.

viewDidLoad랑 혼동하여, '둘이 뭐가 다르지? 같은 거 아닌가' 라는 생각이 드실 수 있습니다.

그러나 viewWillAppear는 뷰가 화면에 보이기 직전마다 호출되기에 다른 화면을 갔다가 돌아오는 상황에서도 호출됩니다.

 

4. viewDidAppear

뷰가 화면에 나타난 직후에 호출되는 함수로 뷰의 애니메이션을 그려줍니다.

애니메이션 작업은 이쪽에서 하면 좋겠죠?

 

5. viewWillDisappear

뷰가 화면에서 사라지기 직전 호출되는 함수입니다. 

그렇기에 화면이 사라질 때 해주어야 하는 것은 이 함수에서 작업하시면 됩니다.

 

6. viewDidDisappear

뷰가 화면에서 완전히 사라진 후에 호출되는 함수입니다.

 

 

이렇게 한 사이클을 한번 돌아보았습니다.

엥? 이대로 흘러가면 위에서 말한 viewWillAppear가 화면에 보여지기 직전마다 호출되는 일은 없지 않나요?

네, 맞습니다. 지금까지의 사이클은 생성되지 않은 뷰의 생명주기였습니다.

우리는 생성되지 않은 뷰를 부르기도 하지만, 이미 생성되어 있는 뷰로 돌아가는 일도 매우 많습니다.

 

뷰 같은 경우에는 Stack 형태로 한 뷰에서 다른 뷰를 부르게 되면 위에 차곡차곡 쌓이게 됩니다.

맨 위의 뷰를 종료하면 바로 아래의 뷰가 보이게 되죠.

이때 바로 아래의 뷰가 호출이 되게 되는데 그때 "뷰가 존재하니?"라는 조건을 일전의 사이클과는 다르게 타게 됩니다.

현재는 뷰가 이미 Stack에 존재합니다. 이 말은 메모리에 뷰가 남아있다, 존재한다는 이야기가 됩니다. 

그렇기에 존재하냐는 질문에 Yes 선택지를 통해 뷰를 새로 만드는 작업은 건너뛰게 됩니다.

 

위에서 말한 viewWillAppear와 viewDidLoad의 확연한 차이점이 여기서 드러나게 됩니다.

viewDidLoad를 거치지 않고 viewWillAppear로 넘어가기에, viewWillAppear는 화면으로 돌아올 때마다 호출되게 됩니다.

이제 두 함수를 확실하게 구분하실 수 있을까요?

 

+

A라는 뷰가 B라는 뷰를 부를 때,

A의 viewWillDisappear가 호출되고 바로 A의 viewDidDisappear가 호출되는 것이 아닌

B의 viewDidLoad, viewWillAppear를 거친 후에 A의 viewDidDisappear가 호출됩니다.

그 후 B의 viewDidAppear가 호출이 됩니다.

1) A - viewWillDisappear
2) B - viewDidLoad
3) B - viewWillAppear
4) A - viewDidDisappear
5) B - viewDidAppear

그렇기에 모든 상황에서 viewWillAppear / viewWillDisappear 후에 viewDidAppear / viewDidDisappear가 호출돼!! 라고 말하시면 틀린 것입니다. 이 부분이 헷갈리신다면, 직접 코드를 짜보시면 쉽게 이해하실 수 있을 겁니다.

 

이렇게 ViewController의 Lifecycle에 대해 알아보았습니다.

만약 틀린 부분이 있다면 댓글로 피드백 부탁드립니다!