본문 바로가기
공부/스위프트

[스위프트] ViewController의 생명주기

by 초코팅촉 2023. 10. 25.
728x90

이번에는 우리가 앱을 만들 때 가장 많이 사용하는 ViewController(이하 뷰컨트롤러)의 생명주기를 알아봅시다.

모든 뷰컨트롤러는 생명주기를 같는데요,

생명주기라 하면 뭐지 싶을수도 있지만 쉽게 말해 생성부터 사라지는 때까지를 통칭 생명주기라 합니다.

 

생명주기는 크게보면 생성, 화면에 나옴, 사라짐 이렇게 세가지 이고 이것을 세분화해서 총 8가지로 나눕니다.

그리고 이들은 각각 메소드로 쓰이기도 하죠.

8가지의 생명주기

그렇다면 각각의 생명주기가 어떻게 다른지 한번 알아봅시다.

 

0. init()

init은 간단합니다. 이 뷰 컨트롤러(클래스)가 처음에 생겨날 때(뷰 컨트롤러의 객체가 생성될 때) 호출되는 메소드입니다.

이때는 아직 뷰가 생성되기 전이라 뷰 요소들에 접근할 수 없습니다.

(근본이라 0부터 시작했습니다. 절대로 쓰는걸 까먹어서 수정하기 귀찮아서 0부터 시작하는거 아님ㅋㅋㅋ)

 

1. loadView()

우선 loadView는 우리가 override까지는 해도 직접적으로 호출할 일은 없을겁니다.

왜냐하면 애플의 문서를 보면 첫문장에 이렇게 써있거든요.

You should never call this method directly.

뒤에 써있는 내용을 이어서 보면

"뷰 컨트롤러가 뷰 프로퍼티를 요청했으나 nil인 경우에만 이 메소드를 호출한다" 고 되어있기 때문입니다.

또한 스토리보드나 .xib파일로 만드는 경우가 아니라 모두 직접적으로 코딩해서 만드는게 아니라면 override도 하지 않는게 좋다고 합니다.

각종 부가적인 내용이 많이 써있긴 하지만 간단히 정리하자면

이 메소드는 컨트롤러랑 연결된 뷰를 만들때 선언되는 메소드(생명주기)인겁니다.

 

2. viewDidLoad()

이 메소드는 정말 많이 보게될것이며, 봐왔을겁니다.

해당 뷰컨트롤러가 메모리에 올라가고나서 호출되는 함수입니다.

이 메소드는 생애주기에서 딱 한번만 호출됩니다.

아직 뷰가 생성되기 전이라 뷰가 화면에 나오기전에 실행되야 할 로직들(예를들면 네트워크)을 이 시점에 실행해야 합니다.

 

3. viewWillAppear()

뷰컨트롤러와 연결된 뷰가 화면에 나타나기전에 "이제 나타날꺼야"(will appear)인 타이밍에 실행됩니다.

그렇다면 viewDidLoad와 뭐가 다르냐고 생각할 수 있습니다.

 

viewDidLoad는 딱 한번만 실행되기에 다른 화면으로 갔다온다고해서 또 실행되거나 하진 않습니다.물론 다른화면으로 갈때 해당 뷰를 완전히 메모리에서 내리는 작업까지 하고 갔다면 몰라도 일반적으론 그러지않죠?하지만 이 viewWillAppear같은 경우에는 우리가 다른화면에 넘어갔다 다시 원래 화면으로 넘어온다면 실행됩니다.

당연하겠죠? 딴 화면 보여줄 땐 딴거를 지금 화면에 그려주니까 다시 돌아올 땐 지금 보여줘야될거 열심히 그리고있겠죠?

 

4. viewDidAppear()

뷰가 화면에 데이터와 함께 완전히 나타난 직후에 실행되는 메소드입니다.

 

5. viewWillDisappear()

다른 뷰컨트롤러로 화면이 넘어가기 전에(현재 뷰가 없어지기 직전에) 실행되는 메소드입니다.

 

6. viewDidDisappear()

원래 보여주고 있던 뷰가 사라지고 난 직후에 실행되는 메소드입니다.

 

7. viewDidUnload()

해당 뷰컨트롤러가 메모리에서 내려갈때 실행됩니다.

ios6 이전에는 메모리가 적었기 때문에 메모리 부족 이벤트가 생겨나기도 했습니다.

그때 해당 뷰컨트롤러가 필요하지 않다고 확인되면

시스템에서 임의로 해당 뷰컨트롤러를 메모리에서 내려버릴수도 있었습니다.

하지만 ios6이후로는 실행되지 않아 deprecated되었다고 합니다.

 

 

 

swift - viewcontroller life cycle