[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
https://developer.apple.com/documentation/uikit/uiviewcontroller
'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 |