UIKit

[iOS / UIKit] View Controller Life Cycle(뷰 컨트롤러 생명 주기)

Minny27 2022. 3. 25. 13:55

오늘 설명할 내용은 view controller life cycle입니다.

iOS 앱 개발에 있어서 필수적으로 알아야 하는 개념입니다.

 

일반적으로 iOS 앱 화면에 view controller를 띄우는데

view controller에는 생명주기(life cycle)가 있고, 이를 고려해서 앱을 개발해야 합니다.

view controller의 생명주기를 도식화하면 다음과 같습니다.

생명주기와 관련된 메서드들에 대해서 알아보겠습니다.

 

1. init(coder:)

View Controller을 storyboard로 생성할 경우, view controller의 객체가 생성될 때 초기화 작업을 하는 메서드가 바로 init(coder:) 메서드입니다. init(coder:) 메서드는 view controller가 생명주기 동안 필요한 자원을 할당합니다.

 

2. init(nibName:bundle:)

Storyboard가 아닌 분리된, nib파일로 생성할 경우 init(nibName:bundle) 메서드로 view controller를 초기화할 수 있습니다.

 

3. loadView()

View Controller에 나타날 view를 만드는 메서드

View Controller를 코드로 생성할 때 사용하는 메서드입니다. view controller를 storyboard 혹은. nib 파일로 생성하는 경우, override하지 않는 것이 좋습니다.

outlet과 action이 이 메서드에서 생성되고 연결됩니다.

 

4. viewDidLoad()

모든 outlet(테이블 뷰, 버튼 등)이 메모리에 로드된 후 호출되는 메서드.

이 메서드는 view controller 생명주기 동안 한 번만 실행됩니다.

이 메서드에서 다음의 공통된 작업을 수행합니다.

  • 네트워크 호출
  • User Interface(addSubview 같은 작업)
  • 한 번 실행하는 작업

 

5. viewWillAppear(_:)

View가 뷰 계층에 추가될 것임을 뷰 컨트롤러에 알리는 메서드

이 메서드는 화면에 view controller가 나타난 이후에 호출되는 메서드입니다.

이 메서드는 다음과 같은 상황에서 사용할 수 있습니다.

  • 비디오 또는 소리 재생
  • 화면에 포함된 애니메이션 실행
  • 화면에 포함된 데이터 업데이트
  • 화면 전환 이후 다시 돌아와서 수행하는 작업

 

6. viewDidAppear(_:)

뷰가 뷰 계층에 추가되었음을 뷰 컨트롤러에 알리는 메서드

데이터를 포함하고 있는 view controller의 view가 완전히 화면에 나타나고 호출되는 메서드입니다.

 

7. viewWillDisappear(_:)

뷰가 뷰 계층에서 제거될 것임을 뷰 컨트롤러에 알리는 메서드

다음 view controller로 화면이 전환되기 전, original view controller가 화면에서 사라질 때 이 메서드가 호출됩니다.

 

8. viewDidDisappear(_:)

뷰가 뷰 계층에서 제거되었음을 뷰 컨트롤러에 알리는 메서드

View Controller가 화면에서 사라지고 나서 이 메서드가 호출됩니다. 화면에서 view controller가 사라진 이후에는 멈추어야 할 작업들 이 메서드를 override 하여 작성할 수 있습니다.

화면이 사라질 때 필요 없을 수 있는 작업은 다음과 같습니다.

  • notification을 듣는 행위 멈추기
  • 다른 객체의 프로퍼티를 observing 멈추기
  • 네트워크를 호출

 

9. deinit()

다른 객체와 마찬가지로 View Controller가 메모리에서 사라지기 전 이 메서드가 호출됩니다. ARC에 의해 할당 해제되지 않은 자원들을 해제하기 위해 override 할 수 있습니다. 또한 백그라운드에서 실행되는 메서드를 이 메서드 내에서 멈출 수 있습니다.


View Controller가 화면에서 사라지는 것이 메모리에서 해제되는 것은 아닙니다. 많은 container view controller들이 그들의 view controller들을 메모리에서 유지하고 있기 때문입니다.


예를 들어 Navigation Controller를 더욱 깊숙이 들어가 보면 이전에 보였던 모든 view controller들이 여전히 메모리에 남아있습니다. Navigation Controller는 View Hierarchy 내에서 Back을 하는 경우에만 사라진 View Controller를 할당 해제할 수 있습니다.


이러한 이유로 화면에서 사라진 view controller들이 정상적으로 작동하고 여전히 notification을 받을 수 있다는 것을 명심해야 합니다.

 

 

 

※ 참고 출처

baked-corn

애플 개발자 문서

medium