본문 바로가기
iOS/Swift

Swift) UIViewController Life Cycle

by Jiseong 2022. 2. 12.

UIViewController Life Cycle

OverView

UIViewController의 Life Cycle을 공부해보려 합니다.

 

ViewController는 모든 IOS App의 중추적인 역할을 합니다.

 

App이 실행되는 동안 ViewController가 만들어지고, 사라지며, 특정 화면을 띄우고 내리는 작업을 수행합니다.


이런 과정들은 사용자 액션이나 특정 이벤트에 의해 메소드가 호출됨으로써 진행되게 됩니다.

 

아래는 위에서 말한 ViewController의 LifeCycle 메소드 입니다.

  • loadView()
  • viewDidLoad()
  • viewDidUnload()
  • viewWillAppear(_ animated: Bool)
  • viewDidAppear(_ animated: Bool)
  • viewWillDisappear(_ animated: Bool)
  • viewDidDisappear(_ animated: Bool)

Life Cycle Method

loadView()

화면에 띄워줄 View를 만드는 메소드로 View를 만들고 메모리에 할당합니다.

 

또한 공식문서를 보면 "사용자는 직접적으로 이 메소드를 호출하면 안된다" 라고 적혀있습니다.

 

안된다.. 라고 하면 사용자가 이 메소드를 직접 호출하면? 앱이 뻑이 난다거나 무슨 에러가 발생을 해야하는데 멀쩡히 실행됨에 의문을 가졌습니다.

왜 되는겨???

하고 공식문서를 좀 더 보고.. 구글링을 해보니 

super.loadView()를 호출하면 ViewController안에 View가 생성되는데, 스토리보드나 xib로 ViewController를 loadView를 호출하여 override해서 쓸 필요가 없다는 소리로 이해했습니다.

 

스토리보드나 xib를 사용하여 ViewController를 만들면, 안에 View까지 다 만들어주기 때문입니다.

 

코드로 ViewController를 만들어줄 땐 그 안에 View가 존재하지 않기때문에 loadView를 override해서 super.loadView를 호출하여 직접 만들어 줘야하므로 사용하는 것입니다.

 

코드로 View를 만들 때 View의 요소(버튼 등등)들을 추가해야 한다면 loadView 메소드에서 추가해주면 됩니다.

 

viewDidLoad()

이 메소드는 ViewController Life에서 단 한번만 호출됩니다. 그러므로 단 한번만 일어날 작업에 대해 이 메소드에 정의해주어야 합니다.

일반적으로.. 리소스를 초기화하거나 초기화면을 구성하는, 데이터를 한번 뿌려주는(초기화) 용도로 주로 사용됩니다. 

 

View가 실체가 되어 메모리에 올라간 직후 호출이되고, 이 땐 아직 사용자에게 View를 보여주지 않습니다.

그저 View를 보여줄 준비가 되었다!! 로 이해하면 좋을 것 같습니다.

 

ViewDidUnload()

 

iOS 6 이전에는 메모리 부족 이벤트가 발생했을 때 해당 뷰컨트롤러의 뷰가 필요하지 않다고 판단되면 시스템이 이를 임의로 메모리에서 해제할 수 있었습니다.

 

이 때 사용되던 메소드들이 viewWillUnload/viewDidUnload입니다. 하지만 iOS6 이후로는 시스템이 이를 수행하지 않기 때문에, 해당 메소드들은 deprecated 되었습니다.

 

이전에 viewWillUnload/viewDidUnload에서 수행하던 작업은 didReceiveMemoryWarning()에서 대신 수행하면 됩니다.

또한 필요하다면 뷰를 메모리에서 해제하는 작업도 여기서 수행하면 됩니다.

 

뷰를 메모리에서 해제는 작업을 수행하기 전에, 반드시 해당 뷰가 뷰 계층에 있지 않은지 확인해야 합니다.

출처

 

didReceiveMemoryWarning()

App의 크기가 커질수록 상당한 부분의 메모리를 차지합니다. OS에선 일정 메모리를 넘어가면 App에 경고를 보내고, 메모리를 초과하게 되면 기기의 안전을 위해 App을 강제로 종료합니다.

 

App의 강제종료는 사용자관점으론 App의 충돌로 보이기때문에 이러한 일이 발생치 않도록 해야합니다.

위 같은 일이 발생치 않기 위해 ViewController가 자원관리를 하는데, OS에서 보내는 경고를 받는 메소드가 바로 didReceiveMemoryWarning()입니다.

 

OS가 보내는 메모리 경고를 받으면, 메소드 안에 경고를 받으면 해야할 작업들을 정의할 수 있습니다.

App이 차지하는 메모리의 일정 부분을 할당 해제시킨다거나... 그런 작업을 정의하는 것입니다.

 

viewWillAppear(_ animated: Bool)

ViewController의 View가 나타나거나, 다음 ViewController의 View로 전환되기 전에 호출되는 메소드입니다.

 

이 메소드엔 주로 화면에 보일 애니메이션을 실행시키거나? 화면에 뿌려지는 데이터를 업데이트하거나.. 노래를 트는 등의 작업을 메소드 내부에 정의합니다.

 

viewDidApppear(_ animated: Bool)

ViewController의 View가 화면에 완전히 나타났을 때 호출되는 함수입니다.

 

이 메소드도 마찬가지로 화면에 보여야 할 데이터들을 뿌려주는 등의 작업을 내부에 정의합니다.

 

viewWillDisappear(_ animated: Bool)

ViewController의 View가 App의 계층구조에서 제거되기 전, 화면에서 사라지기 전에 호출되는 함수입니다.

 

View에서 업데이트했던 내역이 다음 View나, 이전 View로 넘어갔다고 다시 초기화되는 것을 막기위해 이 메소드엔 변경사항 저장, 초기화되지 말아야 할 부분을 제외하고 처음(이전)상태로 되돌리는 등의 작업을 내부에 정의합니다.

 

viewDidDisappear(_ animated: Bool)

ViewCotoller에서 View가 화면에서 완전히 사라지고, App의 계층구조에서 제거된 직후에 호출되는 함수입니다.

 

View가 사라지면 중단해야 할 작업들을 정의하는 등을 내부에 정의합니다.

'iOS > Swift' 카테고리의 다른 글

Swift) DoubleStack - Queue  (0) 2022.02.12
Swift) TDD  (0) 2022.02.12
Swift) MVC  (0) 2022.02.12
왜 디자인 패턴을 중요시 여기는가?  (0) 2022.02.12
Swift) Struct vs Class  (0) 2022.02.12

댓글