본문 바로가기

개발/Swift

[Swift] ViewController LifeCycle

반응형

ViewController Life Cycle

생명주기는 UIViewController가 호출한 메시지나 메소드의 순서로 표시된다.
생명주기는 왜 중요할까?
뷰 컨트롤러 생명주기의 각 단계에 개입하고 싶을 수 있고 
생명주기를 통해 특정한 때에 어떤 일을 하도록 시킬 수 있다.

UIViewController가 생성되면서 생명주기가 시작된다.
사실 생성된 후 가장 먼저 하는 일은 세그웨이 하도록 준비하는 것이다.
세그웨이로 인해 화면에 보이게 되면 준비하는 단계가 실행된다.

그 다음에는 아울렛을 설정한다.
그 다음 뷰 컨트롤러가 화면에 나타나고 사라질 수도 있다. 

 

빠른 순서 요약

  • Instantiated
  • awakeFromNib
  • segue preparation happens
  • outlets get set
  • viewDidLoad
  • viewWillAppear & viewDidAppear
  • viewWillDisappear & viewDidDisappear
  • viewWillLayoutSubvies & viewDidLayoutSubviews
  • didReceiveMemoryWarning

 


 

뷰 컨트롤러로 보내는 메소드에 대해 알아보자.

 

viewDidLoad()

모든 것이 준비됐고 아울렛도 연결돼서 바로 시작하는 곳이다.
초기화 하기에 적합해서 거의 모든 초기화 작업을 viewDidLoad에서 한다.
하지만 화면의 크기와 관련된 것을 이 안에 넣으면 안된다.
어떤 기기인지 확인하지 않은 상태라 경계(bounds)가 아직 설정되지 않았기 때문이다.
일생에 단 한 번만 호출하게 된다.

 

viewWillAppear()

뷰 컨트롤러의 뷰가 곧 화면에 나타날 것이다.
화면에 보이지 않던 시간 동안 발생한 일을 여기서 바로잡을 수 있다.
모델의 모든 정보를 이곳에서 뷰에 로드한다. (특히 모델이 계속 변할 경우에)
화면에 다시 돌아올 때마다 호출된다.

 

viewDidAppear()

화면에 나타났을 때 호출된다.
여기는 애니메이션이나 타이머, GPS같이 무언가를 관찰하는 것을 시작하기에 좋은 곳이다.
예를 들면 네트워크 상에서 대용량 이미지를 가져오는 경우가 있다.

 

viewWillDisappear()

viewDidAppear에서 했던 것을 그대로 되돌리기에 딱 좋은 메소드다.
타이머나 애니메이션, GPS를 관찰하기 시작했다면 여기서 그것들을 멈추면 된다.

 

viewDidDisappear()

완전히 사라졌을 때 호출한다.
여기서 MVC를 정리하기에 좋으나 자주 쓰이지 않는다.

 

 


More?

 

기하학적 메소드는 (레이아웃 관련) 어디에서 호출하느냐?

viewWillLayoutSubviews()
viewDidLayoutSubviews()

 

이 두 메소드는 컨트롤러의 최상위 뷰인 self.view로 보내진다.
view로 layoutSubvies가 보내지기 전후에 메소드를 호출한다.
왜 최상위 뷰에 layoutSubviews가 보내지느냐-
주로 서브 뷰가 들어왔다 나갔다 할 때, 경계가 바뀔 때에 보내진다.
최상위 뷰의 경계가 바뀔 때마다 호출되니 좋은 위치이다.

요즘에는 AutoLayout을 사용할 수 있기 때문에 이 메소드를 구현할 필요가 없다. 
AutoLayout에서 설정한 것들은 layoutSubviews에서 자동으로 불러오기에 컨트롤러에서 작업할 필요가 없다.
하지만 컨트롤러에서 하고 싶다면 이 메소드에서 하면 된다.
하지만 이 메소드를 쓰며 주의해야할 점은 꽤 많이 호출된다는 점과,
가끔 예상하지 못한 곳(변화가 없는 곳)에서 자주 불러온다는 점이다.

Autorotation - viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

기기를 가로모드에서 세로모드로, 혹은 그 반대로 돌릴 때 사용된다.
이런 경우에는 경계가 바뀌었으니 viewWill/DidLayoutSubviews를 호출한다.

 

Low Memory - didReceiveMoemoryWarning()

이 부분은 잘 쓰이지 않는다.
앱이 대용량 아이템을 사용할 경우에만 신경쓰면 된다.
예를 들면 비디오, 이미지, 대용량 음악 파일과 같은 항목들이 있다.
최신 기기는 용량이 커서 그런 일은 잘 없지만 대용량 메모리가 누수되면 메모리가 부족할 수 있다.
그런 경우 이 단계로 넘어가 뷰 컨트롤러에게 나중에 쉽게 할당할 수 있는 메모리는 힙에서 해제하라고 요청한다.
메모리 청소 같은 느낌이다. 
앱의 메모리 누수가 심해 용량이 점점 증가하면 이 단계로 넘어가게 되는데, 
코드를 제대로 짜지 못해 누수를 처리할 수 없어 메모리 누수가 지속된다면 iOS가 앱을 강제종료할 수도 있다.

 

awakeFromNib()

스토리보드에서 깨어나는 것이다. 
이 부분은 생명주기에 연관된 것은 아니지만, 스토리보드에서 나온 모든 객체, UIView, 뷰 컨트롤러는 awakeFromNib로 호출된다.
이것은 맨 처음 단계인 초기화 다음, 세그웨이 준비 전 아울렛 연결 전에 호출된다.
정말 일찍 무언가를 해야할 때를 제외하고는 최대한 이곳에 아무것도 하지 않는다.

반응형

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

[Swift] Multithreading  (0) 2021.02.26
[Swift] DispatchQueue 종류  (0) 2021.02.26
[Swift] Interface  (0) 2021.02.26
[Swift] NSAttributedString  (0) 2021.02.25
[Swift] 문자열 색인  (0) 2021.02.25