Swift/학습

[Swift] iOS ViewController의 LifeCycle에 대하여 알아보자!

언클린 2020. 6. 22. 13:35
728x90

이번 글에서는 ViewController의 생명 주기에 대하여 알아보겠습니다.

개발을 하면서 대충 어떤 식으로 움직이는지 어느 상황에 사용할지 정도는 알고 있었지만 정확히 어떠한 역할을 수행할 수 있는지 자세히 알아본 적은 없었던 것 같아 이번 기회에 알아보았습니다. 

 

아래는 Apple Develop 에서 나타낸 ViewController의 생명 주기도입니다.

Appearing -> Appered -> Disappearing -> Disappeared -> ... repeat와 같이 되어 있는 것을 보아서

크게 나타나는 중의 처리, 나타난 후의 처리, 사라지는 중의 처리, 사라진 후의 처리로 나뉘는 것을 알 수 있습니다.

 

그렇다면 이제 하나하나 어떠한 역할을 수행하고 어떠한 상황에 사용이 되는지 아래와 같이 나누어 알아보겠습니다.

  1. loadView()
  2. viewDidLoad()
  3. viewWillAppear()
  4. viewDidAppear()
  5. viewWillDisappear()
  6. viewDidDisappear()

1. loadView()

위의 그림에서는 보이지 않는 메서드지만 이 메서드 또한 생명 주기에 포함이 되기 때문에 알아두시는 것이 좋다고 생각합니다.

loadView() 화면에 출력할 뷰를 만드는 메서드입니다. 

스토리보드나 xib와 같은 interfaceBuilder파일을 사용하지 않고 전체적으로 코드로만 뷰를 구성할 경우 오버라이드 하여 사용합니다.

If you use Interface Builder to create your views and initialize the view controller, 
you must not override this method.

주로 사용하는 IBOutlet이나 IBAction의 설정이 이 메서드에서 연결이 된다고 합니다.

2. viewDidLoad()

아마 프로젝트를 시작하면서 가장 친숙하고 먼저 보게 되는 메서드라고 생각하 빈다. ViewController를 생성할 시 기본적으로 작성이 되어 있는 메서드입니다.

loadView()에서 실행한 UI의 생성 처리가 완료된 후 불려지는 메서드입니다. 때문에 이 메소드 내에서는 화면에 보여줄 데이터 처리나 표시 전 필요한 백그라운드 처리를 설정해줍니다.

 

주의할 점은 초기화 후 1회만 실행이 된다는 점입니다. 

인스턴스의 파기, 메모리 부족 등 이외의 인스턴스가 존재하는 한 실행되지 않습니다.

3. viewWillAppear()

뷰가 나타나기 직전에 실행되는 메서드입니다.

화면 전환으로 인한 데이터의 갱신과 같은 처리를 보통 이 메서드에서 사용되어집니다. 

 

주의할 점

Swift5 현시점에서 modal Type에 따라서 화면 전환 후 복귀 시 viewWillAppear() 메서드가 실행되는 타입이 있고 실행되지 않는 타입이 있습니다. 

이 부분에 대해서는 다음번에 조사해서 한 번 알아보겠습니다. 보통은 .fullScreen으로 설정하면 문제는 없습니다.

(하지만, 다른 타입을 사용할 때도 있기 때문에...) 

4. viewDidAppear()

ViewController의 뷰가 완전히 화면에 출력되었을 때 실행되는 메서드입니다.

때문에, 주의하실 점은 이미 뷰가 생성되어 출력이 완료가 되었기 때문에 이 시점에서 뷰를 생성하거나 다른 갱신을 하신다면 제대로 수행이 되질 않을 수 있습니다.

5. viewWillDisappear()

다른 ViewController로 화면 전환이 이루어질 때 ViewController가 사라지기 직전에 실행되는 메서드입니다.

현재 표시 중인 다이어로그를 닫는다 던가 화면 전환 전에 필요한 작업을 수행합니다.

6. viewDidDisappear()

ViewController의 뷰가 완전히 화면에서 사라졌을 때 실행되는 메서드입니다. 

주의하실 점은 viewDidDisappear()가 실행되었다고 viewController오브젝트가 파기된 것은 아니라는 것입니다.

화면이 사라지고 더 이상 필요 없는 작업들을 종료들이 이 메서드에서 사용되어집니다. (notification 이나 observer 등)

7. didReceiveMemoryWarning()

생명 주기와는 별개로 didReceiveMemoryWarning() 메서드는 메모리 부족으로 인하여 viewController가 파기되기 직전에 실행되는 메서드입니다.

기기마다 제한적인 메모리 양을 가지고 있기 때문에 할당 메모리가 넘어가게 되면 App은 강제적으로 종료되어집니다. 

때문에 메모리의 해제 처리 등을 수행시켜 강제 종료를 막는 것이 좋습니다.

8. 실행

그렇다면 간단히 어떤 식으로 동작하는지 프로젝트를 통하여 알아보겠습니다.

#테스트 기준

  • Navigation 사용
  • Push를 통한 화면 전환
  • 확인을 위해 interfaceBuilder를 사용하였지만 loadView()를 오버라이드 하였습니다.

알아보는 내용은 아래와 같습니다.

  1. 첫 번째 ViewController 생성 시
  2. 화면 전환을 통하여 첫 번째 ViewController 비표시, 두 번째 ViewController 생성 시
  3. 첫 번째 ViewController로 복귀 시
  4. 다시 두 번째 ViewController로 이동 시

1. 첫 번째 ViewController 생성 시

어플 실행 시 출력되는 첫 번째 ViewController에 대한 주기입니다.

화면이 전환이 이루어지지 않기 때문에 Disappearing의 처리와 Disappeared처리는 진행되지 않습니다.

생명 주기 예상과 같게 출력이 되는 것을 아실 수 있습니다.

[1] loadView
[1] viewDidLoad
[1] viewWillAppear
[1] viewDidAppear

2. 화면 전환을 통하여 첫 번째 ViewController 비표시, 두 번째 ViewController 생성 시

중요한 부분이라고 생각합니다. 화면 전환 시 순서가 첫 번째 ViewController와 두 번째 ViewController의 주기가 섞여 있습니다.

첫 번째 ViewController의 Disappearing이 실행된 후 두 번째 ViewController의 Appearing이 실행되는 것을 아실 수 있습니다.

Disappeared와 Appeared도 마찬가지입니다.

[2] loadView
[2] viewDidLoad
[1] viewWillDisappear
[2] viewWillAppear
[1] viewDidDisappear
[2] viewDidAppear

3. 첫 번째 ViewController로 복귀 시

파기되지 않은 첫 번째 ViewController의 viewDidLoad()가 출력되지 않은 것을 아실 수 있습니다.

화면 복귀 시 주기의 순서는 전환과 같습니다.

[2] viewWillDisappear
[1] viewWillAppear
[2] viewDidDisappear
[1] viewDidAppear

4. 다시 두 번째  ViewController로 이동 시

 

두 번째 ViewController가 다시 loadView(), viewDidLoad()가 실행되는 것으로 보아 복귀 시 두 번째 ViewController는 파기된 다는 것을 아실 수 있습니다.

 

순서는 화면 전환과 같습니다.

[2] loadView
[2] viewDidLoad
[1] viewWillDisappear
[2] viewWillAppear
[1] viewDidDisappear
[2] viewDidAppear

9. 마무리

이번 글을 통하여 ViewController의 생명 주기에 대하여 알아보았습니다. 

개발에 있어서 ViewController의 영향력은 크기 때문에 어떠한 방식으로 생성되고 소멸되는지 알아두는 것이 좋다고 생각합니다.

제 설명에 부족한 점이 있거나 지적할 사항 등이 있으신 분은 댓글에 적어주시면 감사하겠습니다.

많은 공부가 될 것 같습니다.

부족한 설명이지만 도움이 되었으면 좋겠습니다.

감사합니다.

 

#참고

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html

 

Start Developing iOS Apps (Swift): Work with View Controllers

Start Developing iOS Apps (Swift)

developer.apple.com


환경 

Xcode 11.3.1

Swift 5

 

 

 

 

728x90