iOS

View Life-Cycle - swfit

나른한코딩 2021. 7. 17. 13:30

 

: View Controller의 생명주기에 대해 알아보고자 한다.

  • iOS앱은 ViewController들로 이루어져 있다. (줄여서 VC 라고 적도록 하겠다.)
  • 각각의 VC는 생명주기를 가지고 있다.

 

 

 

UIViewController 란?
: An object that manages a view hierarchy for your UIKit app.

* For Detail : https://developer.apple.com/documentation/uikit/uiviewcontroller

 

 


 

 

VC’s Responsibility

  • 주어진 데이터의 변화에 대한 응답으로 view들의 contents 업데이트 하기.
  • View들과 함께 사용자의 상호작용에 응답한다. (Event Handling)
  • View들을 재조정하고, 전반적인 인터페이스 레이아웃을 관리한다.
  • (다른 vc들 포함) 다른 오브젝트들과 앱을 구성한다.

 

 


 

 

Valid State Transitions

 

view life cycle function

  • 다음 그림은 vc의 view들의 시각적으로 볼 수 있는 상태들을 보여주고, 상태 변화가 나타날 수 있음을 보여준다.

 

 


 

 

 

Life-Cycle Method

 

UIViewControllerLifeCycle 참고사진1
UIViewControllerLifeCycle 참고사진2

 

: vc 간의 전환이 이루어질 때, 이전 vc의 view가 유지될 수도, 아닐 수도 있다.

혹은, 전환될 vc에서 이전 vc의 정보를 이어받아 작업해야 하는경우도 있다.

위에 나온 view들의 상태에 따라, 해당 시점을 이벤트화 해두어 그 시점에서 해야할 동작을 지정할 수 있다.

 

 

 

init()

  • storyboard나 nib 파일을 통해 vc를 초기화 한다.
  • view를 만들 때 사용할 정보를 vc에 저장하는 단계이다.

loadView()

  • 화면에 띄워줄 view 실제로 생성하여 메모리에 올린다.
  • 사용자가 이 메소드를 직접 호출하는 것 권장하지 않음.
    ( view의 모든 것을 직접코딩하여 만드는 경우를 제외하고는 ovrride하지 않는 것을 권장한다.)
  • 만약 직접 호출 하는 경우 : storyboard나 nib을 사용하지 않는다면,
    이 메소드를 override해서 view를 만들고 view hierarchy를 구성해야 한다.
  • 현재 view 프로퍼티가 nil 이면서 view 프로퍼티가 요청될 때 vc가 이 메소드를 호출한다.

viewDidLoad()

  • vc가 메모리에 로드 된 직후에 호출되며 시스템에 의해 자동으로 호출된다.
  • 사용자에게 화면이 보여지기 전에 필요한 행위들을 작성할 수 있다.
  • 일반적으로 resource를 초기화하거나, 초기화면을 구성하는 용도로 사용된다.
  • vc 생에 딱 1번 호출 된다! → 따라서 딱 1번만 있을 행위에 대해서는 여기 안에 작성해줄 것.

viewWillAppear()

  • vc의 화면이 올라오고 난 후, 뷰가 view hierarchy에 추가되기 직전에, 해당 뷰가 나타나기 위한 애니메이션이 설정되기 전에 호출된다.
    (뷰가 로드 된 후, 눈에 보이기 전에 컨트롤러에게 알리는 역할)
  • 이 메소드를 override 할 때는 반드시 부모 클래스의 viewWIllAppear를 호출하도록 정의해야 한다.
  • 다른 뷰로 이동했다가 돌아올 때 재호출되는 메소드로, 화면이 나타날 때 마다 수행해야 하는 작업을 정의하기 좋다.
  • 화면 전환을 통해 다시 현재 화면으로 돌아올 때는 viewDidLoad()가 아닌 viewWillAppear()이 호출 된다.

viewDidLoad와 viewWillAppear의 호출

viewDidAppear()

  • view가 view hierarchy에 추가된 직후에 호출된다.
    (view가 데이터와 함께 완전히 화면에 나타난 후 호출되는 메소드.)
  • 이 메소드를 override해서 나타나는 뷰에 대한 추가적인 설정을 해줄 수 있다.
  • 마찬가지로, 반드시 부모 클래스의 viewDidAppear를 호출하도록 정의해야 한다.
  • ❗️: 만약 어떤 vc가 다른 vc를 popover 방식으로 띄운다면, popover로 띄워진 vc가 사라질 때 popver로 띄어진 vc에 대해서는 viewDidAppear가 호출되지 않는다.

viewWillDisAppear()

  • 다음 vc화면으로 전환하기 위해 view가 view hierarchy에서 제거되기 직전 이나
    vc가 사라지기 위한 애니메이션이 설정되기 직전에 호출되는 메소드.
  • 이 메소드를 override해서 해당 뷰를 통해 일어난 변화를 저장하거나, first responder상태를 내려놓거나, 뷰가 나타났을 때 조정됬던 다른 뷰들을 원래대로 돌려놓는 등의 작업을 수행할 수 있다.
  • 마찬가지로, 반드시 부모 클래스의 viewWillDisappear를 호출하도록 정의해야 한다.
  • ❗️: 보통 will - did가 쌍으로 호출되지만, 반드시 그런 것은 아니다. 어떤 작업을 제대로 수행하기 위해서는 will-did 쌍 뿐 아니라, 상대쪽 will만이 호출되는 경우도 올바르게 대응해줘야 한다.

viewDidDisAppear()

  • view가 view hierarchy에서 제거된 이후에 호출된다.
    (vc들이 화면에서 사라지고 나서 호출되는 메소드.)
  • 이 메소드를 override해서 화면이 사라지고 나서 필요없어지는(혹은 멈춰야하는) 작업들을 여기서 한다.
  • 마찬가지로, 반드시 부모 클래스의 viewDidDisAppear()를 호출하도록 정의해야 한다.

deinit()

  • vc의 참조가 0이 되면 deinit()을 통해
    vc가 가지고 있던 view와 관련 resource들을 해제함으로써 완전히 생명주기가 끝나게 된다.

 


 

 

참고 자료

더보기

 

 

 

 

 

 

 

틀린부분이 있거나, 더 좋은 방법이 있다면 댓글로 남겨주세요! 
🌈댓글은 언제나 환영입니다🙏🏻

 

 

 

 

 

 

 

반응형