BOID

[iOS] 뷰 컨트롤러의 상태 변화와 생명주기 본문

IOS 시작기

[iOS] 뷰 컨트롤러의 상태 변화와 생명주기

HoonIOS 2021. 3. 19. 11:25

안녕하세요, HoonIOS입니다. :)

 

저번 시간에 뷰 컨트롤러, 뷰에 대해 알아봤는데요, 그래서!!! 이번에는 뷰 컨트롤러의 상태가 켜지고 꺼지는 같은 상태변화와 생명주기를 알아보려고 합니다.

 

뷰 컨트롤러 상태변화

  • 앱의 생명주기
     - Not Running( 앱이 아직 실행되지 않았거나, 완전히 종료된 상태 )
     - Inactive( 앱이 실행 중이지만 사용자로부터 event를 받을 수 없는 상태, 홈버튼을 누르면 앱이 background로 가는데 이상태를 의미합니다. )
    - Active( 앱이 실행중이고 사용자로부터 event를 받을 수 있는 상태)
    - Suspend( 앱이 백그라운드 상태에 진입했을떄 다른 작업을 하지 않으면 Suspend 상태로 진입하게 됩니다, 메모리에 관련 데이터만 저장되어 있는 상태입니다. )

- 앱은 위에서 설명한 상태나 생명주기를 가지고 있는데 , 뷰 컨트롤러도 생명주기와 생태변화를 가집니다.

- 뷰컨트롤러의 생명 주기는 장면의 전환과 복귀에 밀접하게 연관되어 있습니다. 뷰 컨트롤러도 같이 새로운 장면으로 전환하거나 이전 화면으로 복귀하는 과정에서 뷰 컨트롤러 객체의 생성과 소멸이 발생하기 때문입니다.

 

• 뷰컨트롤러의 생명주기의 순환을 대략적으로 설명해 보겠습니다.

- 앱을 처음 실행하거나 새로운 장면으로 전환할 때에는 그 장면을 담당하는 뷰컨트롤러뷰 컨트롤러 객체가 새로 생성된다. 이렇게 생성된 객체는 메모리에 로드되어 자신의 역할을 하죠, 주어진 역할을 모두 끝내면 앱은 이전 장면으로 복귀하고, 생성되었던 뷰 컨트롤러 객체는 메모리에서 해체되면서 소멸합니다.

- 만약 메모리 해체되었던 장면을 다시 전환할경우 뷰 컨트롤러의 객체는 이미 소멸된 후이기 때문에 다시 새롭게 생성되고 역할을 끝내면 또다시 소멸됩니다.

 

-  화면이 처음 메모리에 로드되고 스크린에 장면이 표시되었다가 장면의 목적을 달성하여 사라지는 일련의 과정동안 뷰 컨트롤러는 계속해서 다른 뷰 컨트롤러와의 상호관계에 의하여 동작하거나 하드웨어, OS의 제어에 의해 움직이게 됩니다.

- 따라서 개발을 할때 화면 상태에 따라 메모리를 효율적으로 관리하기 위해서는 세부적인 제어가 필요한데( 만약 메모리 누수가 많으면 그만큼 앱도 느려지고 답답하니 사용자가 불편해하겠죠?) 이렇게 세부적인 제어를 하는 것을 튜닝이라고 합니다.

- 튜닝의 예를 들어서 스톱워치를 화면에서 지속적으로 돌리다가 앱을 다른 화면에 덮이면 굳이 화면을 갱신하지 않고 스크린에 다시 화면에 표시될때 한 번에 계산해서 경과를 처리하면 됩니다.

이런 식으로 루틴을 작성하여 메모리의 낭비를 줄이고 효율적으로 사용할 수 있습니다.

 

뷰 컨트롤러 상태변화 메소드

- 앱의 생명주기에 따라 호출되는 앱 델리게이트의 메소드들이 정해져 있는 것처럼 뷰 컨트롤러가 특정 상태 변화를 일으킬 때 호출되는 메소드들도 정의되어 있습니다. 

- 앱의 생명주기 메소드랑 뷰 컨트롤러의 생명주기 메소드의 차이점은 이 메소드는 앱 델리게이트가 아니라 뷰 컨트롤러에 정의되어 있습니다.

 

뷰컨트롤러의 생명주기

- 위 사진을 보면 뷰 컨트롤러에 따른 상태변화 메소드가 있는데 우선 상태에 대해 설명해 보겠습니다.

  • Appearing - 뷰 컨트롤러가 스크린에 등장히 시작한 순간부터 등장을 완료하기 직전까지의 상태를 말합니다. 
    만약, 화면이 등장하고 있는 와중에 종료가 되면은 Appearing이 발생하면서 Disappearing이 동시 동작을 합니다.
  • Appeared - 뷰컨트롤러가 스크린 전체에 완전히 등장하는 상태를 말합니다.
  • Disappearing - 뷰컨트롤러가 스크린에서 가려지기 시작해서 완전히 가려지기 직전까지의 상태 또는 퇴장하기 시작해서 완전히 퇴장하기 직전까지의 상태를 말합니다. Appearing설명에서 말씀드렸듯이 Disappearing이 동시 동작하는 경우가 생깁니다.
  • Disappeared - 뷰 컨트롤러가 스크린에서 완전 가려졌거나 퇴장한 상태를 말합니다. 

- 정상적인 뷰컨트롤러 생명주기를 요약하자면 Appearing 상태를 거쳐 Appeared 상태가 진행되고, 만약 종료하려면 Disappearing 상태를 거쳐 Disappeared상태로 진행이 됩니다.

- 반대로 정상적이지 않은 등장하는 도중에 다시 퇴장되는 경우가 있는데요, 이럴 때는 Appearing 상태에서 Appeared상태로 가지 않고 곧바로 Disappeared상태로 가게 됩니다.

- 사용자가 홈 버튼을 눌러 앱을 백그라운드 상태로 보냈을 때도 마찬가지로 화면이 퇴장하는 상태변화가 발생하는데, 단 이때에는 다른 뷰 컨트롤러와 교차하지 않습니다.

 

• Disappearing 상태는 두가지 경우로부터 만들어집니다.
  1. 새로운 뷰컨트롤러가 등장하여 현재의 화면을 덮는경우, 이때에는 Disappeared 상태가 진행되었다가 미래의 어느순간에 다시 Appearing상태로 진행될수 있습니다.( 덮어진 화면을 다시 걷어낼경우 기존의 뷰컨트롤러가 다시 화면에 나타나기 때문입니다.)

  2. 다른 경우는 이전 화면으로 돌아가기 위해 현재의 뷰컨트롤러가 사라지는 경우입니다. 즉 퇴장을 하는거 입니다.
이때에는 Disappeared상태로 진행되었다가, 미래의 어느순간에 메모리에서 소멸하게 됩니다. (앱의 생명주기에서Suspend와 비슷한 의미라고 하면될꺼같아요)

뷰 컨트롤러 상태변화 메소드

  1. viewWillAppear(_:)
    - 화면이 처음 실행되거나 또는 퇴장한 상태에서 다시 등장하기 시작하는 상태(Appearing)로 바뀌는 동안 뷰 컨트롤러는 앱 객체에 의해 메소드가 호출됩니다.
    - 이 메소드는 UIViewController클래스에 정의된 메소드로 화면이 등장할 때마다 데이터를 갱신해주고 싶으면 이 메소드를 오버라이드 해서 원하는 코드를 작성하면 됩니다.
    - 예를 들어 테이블 뷰 컨트롤러에서 테이블 뷰를 reload 하고 싶을 때. reloadData( )메소드를 viewWillAppear 메소드에 정의해주면 됩니다.
  2. viewDidAppear(_:)
    - 화면이 등장하기 시작한 단계를 넘어서 완전히 등장하고 나면 해당 메소드가 호출됩니다.
  3. viewWillDisappear(_:)
    - 스크린으로부터 화면이 퇴장하는 도중에 사용자의 액션에 의해 다시 재등장하는 경우 이메소드가 호출됩니다.
    ( 이경우에는 완전히 화면이 퇴장하는 게 아니므로 viewDidDisappear(_:) 메소드가 발생하지는 않습니다. )
    - 화면이 재등장하기 시작할 때 호출됩니다.
  4. viewDidDisappear(_:)
    - 다른 액션이 일어나 화면의 전환이 이루어지거나 홈 버튼을 눌러 앱이 백그라운드로 내려가는 등 스크린에서 화면이 퇴장된 상태가 발생하면 이 메소드가 호출됩니다.
    - 뷰가 완전히 사라지면 해당 메서드가 호출됩니다.

- 이런 생명주기 관련 메소들은 원하는 시점에 이런 코드들을 실행시키려면 어떻게 해야 하는가 의문을 가질 때 충분한 답을 줄 수 있어 언제라는 고민을 어느 메소드에서 사용을 해야하는가 라는 고민을 해주게 됩니다.

- 이렇게 생명주기 관련 메소드를 잘 활용하면 화면을 재구성하거나 할 때 유용하게 쓰이므로 잘 알아두는 게 좋습니다.

 

지금까지 뷰 컨트롤러의 생명주기, 메소드에대해 알아봤는데요!

 

상당히 중요한 부분이니 잘 이해하셨으면 좋겠습니다!

 

그럼 오늘도 좋은 하루 보내세요!

반응형
Comments