iOS 개발/iOS

[iOS] ViewController LifeCycle (생명주기)

도지대디 2022. 6. 16. 23:44

[iOS] ViewController LifeCycle (생명주기)

UIKit 을 이용해 앱을 개발하다보면 viewDidLoad() 라는 메소드를 보신적이 있을겁니다.

 

이는 ViewController 의 생명주기 메소드중 하나입니다.

 

생명주기란 ViewController 가 생성되고 사라지는 등 View 의 상태와 관련된 과정을 뜻하는데, 오늘은 이 생명주기 메소드들에 대해 알아보겠습니다.

위 이미지는 ViewController 의 생명주기라고 검색하면 쉽게 찾아볼 수 있는 이미지입니다.

 

하지만 위의 이미지에 포함되어있는 viewDidUnload() 메소드는 iOS 6 부터 사용되지 않고 있습니다.

 

ViewController 의 생명주기에 대한 아무 지식이 없다고 가정했을 때 위 이미지가 이해하기 쉬운 것 같아 가져와보았습니다.

 

생명주기 메소드는 viewDidLoad() 부터 viewDidDisappear() 까지 순차적으로 호출됩니다.

생명주기 메소드

위 이미지가 현재 애플 공식문서에서 제공되고 있는 이미지입니다.

 

ViewController 의 생명주기 메소드는 언뜻 보면 복잡해보일 수 있지만, 생각보다 친절한 이름들을 가지고 있습니다.

viewDidLoad

먼저 viewDidLoad() 메소드입니다. 해당 메소드는 이름 그대로 View 가 메모리에 로드되고 난 후 딱 한번만 호출됩니다.

 

해당 메소드는 시스템에 의해 자동으로 호출되기 때문에 일반적으로 리소스나 화면의 구성요소들을 초기화하는 용도로 사용됩니다.

viewWillAppear

viewWillAppear() 라는 메소드명을 직역하자면 "View 가 보일것이다" 정도쯤 될것입니다.

 

해당 메소드는 말 그대로 View 가 보이기 직전, 즉 만들어진 ViewController 가 View 계층 구조에 추가되기 직전에 호출됩니다.

 

이는 메모리 로드와는 상관없이 현재 화면에 해당 View 가 보이는지에 대해서만 영향을 받기 때문에 생성 시 딱 한번만 호출되는 viewDidLoad() 메소드와는 달리, View 가 화면에 나타나기 직전마다 호출됩니다.

viewDidAppear

viewDidAppear() 메소드는 말 그대로 View 가 화면에 나타난 직후 호출됩니다.

 

이는 ViewController 가 View 계층 구조에 추가된 직후를 뜻하며 viewWillAppear() 메소드의 다음 단계입니다.

viewWillDisappear

앱을 사용하면서 다른 화면으로 넘어가거나, 이전 화면으로 돌아갈때 현재 사용하던 화면은 사라집니다.

 

이렇게 현재 View 가 화면에서 사라지기 직전에 viewWillDisappear() 메소드가 호출됩니다.

 

이는 ViewController 가 View 계층 구조에서 사라지기 직전을 뜻합니다.

viewDidDisappear

마지막으로 viewDidDisappear() 메소드는 ViewController 가 View 계층 구조에서 사라진 직후, 즉 View 가 화면에서 사라진 직후에 호출됩니다.

loadView

loadView() 라는 메소드는 사실 viewDidLoad() 메소드 이전에 호출되는데, 애플 공식문서에는 해당 메소드를 직접 호출해서는 안된다고 적혀있습니다.

 

loadView() 메소드는 View 를 만들고 이를 메모리에 올리는 역할을 하는 메소드이기 때문에 함부로 호출해서 사용해서는 안되고, 만약 프로그램의 초기값들을 설정해야 하는 경우라면 View 가 메모리에 할당되는 작업이 완료된 후인 viewDidLoad() 에서 실행하는 것이 맞습니다.

viewDidUnload

위에서 잠시 설명했던 viewDidUnload() 메소드는 iOS 6 이후로 사용이 중지되었다고 합니다.

 

iOS 5 이전에는 메모리 부족 상태가 발생할 수 있었기 때문에 해당 메소드를 통해 ViewController 가 View 에 대한 별도의 Reference 를 가지고 있는 경우 이를 해제할 수 있었는데, iOS 6 이상부터는 그럴 필요가 없어졌다고 합니다.

 

아마 ARC 의 등장으로 필요가 없어진 것이 아닐까 조심스레 추측해봅니다.

예제

생명주기 메소드를 실제로 적용시켜 호출되는 방식을 살펴보겠습니다.

A 와 B 라는 이름을 가진 View 2개를 만들었습니다.

 

View A 의 우측 상단 버튼을 탭하면 View B 로 넘어가고, View B 에서 뒤로가기 버튼을 누르면 View A 로 되돌아갑니다.

 

이 때 생명주기 메소드가 어떻게 동작하는지 알기 위해서 viewDidLoad() 부터 viewDidDisappear() 까지 모두 콘솔에 출력해보겠습니다.

 

먼저 앱을 처음 시동하여 View A 가 화면에 나타났을 때입니다.

A 는 앱이 시동된 후 가장 먼저 나타납니다. A 가 메모리에 올라갈 때 viewDidLoad() 가 호출되고, 이후 화면에 출력되기 직전 viewWillAppear() 가 호출됩니다. 화면에 A 가 모두 나타난 후에는 viewDidAppear() 가 호출됩니다.

 

그럼 B 로 넘어가보겠습니다.

A 에서 B 로 넘어가는 버튼을 클릭하면 View B 가 메모리에 올라가기 때문에 viewDidLoad() 가 호출됩니다.

 

B 가 메모리에 올라갔기 때문에 A 는 사라질 준비를 해야겠죠? A 는 viewWillDisappear() 를 호출하고 B 는 화면에 나타나야 하기 때문에 viewWillAppear() 를 호출합니다.

 

B 가 화면에 나타날 준비를 끝마쳤기 때문에 A 는 viewDidDisappear() 호출하며 화면에서 사라지고, B 는 viewDidAppear() 를 호출하며 화면에 나타납니다.

 

이제 다시 뒤로가기 버튼을 눌러 A 로 돌아가보겠습니다.

앞서 말했듯 viewDidLoad() 는 메모리에 View 가 할당될때 한번만 호출되기 때문에 B 에서 A 로 다시 넘어온다고 해도 viewDidLoad() 는 호출되지 않습니다.

 

B 는 뒤로가기 버튼으로 인해 사라질것이기 때문에 viewWillDisappear() 를 호출하고, A 는 다시 나타날 준비를 위해 viewWillAppear() 를 호출합니다.

 

B 는 viewDidDisappear() 를 호출하며 사라지고, A 는 viewDidAppear() 를 호출하며 다시 화면에 나타나게 됩니다.

이 과정을 간략하게 표현하자면 아래 이미지와 같을 것입니다.

참고 링크

https://zeddios.tistory.com/43

 

iOS ) View Controller의 생명주기(Life-Cycle)

안녕하세요! 오늘은 View Controller생명 주기에 대해 알아보겠습니다. iOS를 시작하려고 하거나, 배우고 있는 분들이라면 반드시 알아야 해요. 하나하나 제대로 알아봅시다 ㅎㅎ View Controller의 생명

zeddios.tistory.com

https://icksw.tistory.com/187

 

[iOS 앱개발] View Controller의 Life Cycle

안녕하세요 Pingu입니다~🐧 오늘은 iOS 앱개발에서 아주아주 중요한 ViewController의 Life cycle에 대해 알아보려고 합니다. 제일 처음 iOS 공부를 시작할 때 공부한 내용인데, 정리는 이제야 해서 올리

icksw.tistory.com

https://developer.apple.com/documentation/uikit/uiviewcontroller

 

Apple Developer Documentation

 

developer.apple.com

 

'iOS 개발 > iOS' 카테고리의 다른 글

[iOS] Delegate Pattern  (0) 2022.07.06
[iOS] UINavigationController  (0) 2022.06.30
[iOS] 앱 생명주기 (App LifeCycle)  (0) 2022.06.24
[iOS] Frame & Bounds  (0) 2022.06.17
[iOS] UITableView & UICollectionView  (0) 2022.06.17