[UIKit] ViewController의 LifeCycle

2023. 5. 28. 15:28iOS 개발/UiKit

ViewController란 ?

Swift와 iOS 개발에서 UIKit 프레임워크에 속하는 클래스로 화면의 상태와 동작을 관리
 
iOS 앱에서 각 화면은 일반적으로 하나의 ViewController와 연결됩니다.
ViewController는 UIKitUIViewController 클래스를 상속받아 작성되며,
앱의 화면에 해당하는 모든 구성 요소를 처리하고 제어합니다.

 

ViewController는 다음과 같은 역할을 수행합니다.

  • 뷰의 로드 및 초기화
  • 사용자 입력 처리
  • 데이터 관리 및 로직 처리
  • 애니메이션 및 화면 전환 관리
  • 다른 ViewController와의 통신 및 데이터 전달

ViewController는 뷰의 LifeCycle 이벤트를 처리하고, 해당 뷰가 화면에 나타나거나 사라질 때 필요한 작업을 수행합니다.

 

ViewController의 LifeCycle이란?

ViewController 객체가 생성되고 화면에 나타나고 사라질 때까지의 주요 이벤트와 메서드 호출 순서를 말합니다.
 

ViewController의 LifeCycle


ViewController의 LifeCycle을 잘 활용하면 앱의 화면 동작을 세밀하게 제어하고, 필요한 작업을 적절한 시기에 수행할 수 있습니다. 이를 통해 사용자 경험을 향상시키고 앱의 성능 및 안정성을 향상시킬 수 있습니다.

 

 

다음 코드는 UIkit으로 프로젝트를 생성할때 ViewController.swift에 자동으로 생성되는 코드입니다.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

이 코드가 바로 LifeCycle의 초기부분입니다.
여기에 코드를 추가해 전체적인 LifeCycle 구조에 대해 알아보겠습니다.

import UIKit

class ViewController: UIViewController {
    
    //ViewController의 뷰가 메모리에 로드된 후에 호출
    override func viewDidLoad() {
        super.viewDidLoad()
        print("View did load")
    }
    
    //ViewController의 뷰가 화면에 나타나기 직전에 호출
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("View will appear")
    }
    
    //ViewController의 뷰가 화면에 나타난 후에 호출
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("View did appear")
    }
    
    //ViewController의 뷰가 화면에서 사라지기 직전에 호출
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("View will disappear")
    }
    
    //ViewController의 뷰가 화면에서 완전히 사라진 후에 호출
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("View did disappear")
    }
    
    //메모리 부족 상황에서 호출
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        print("Memory warning")
    }
}

 
 

1. viewDidLoad()

ViewController 객체의 초기 설정 및 추가 작업을 수행하기 위해 사용

//ViewController의 뷰가 메모리에 로드된 후에 호출
    override func viewDidLoad() {
        super.viewDidLoad()
        print("View did load")
    }
  1. 데이터 초기화: 화면에 표시될 데이터를 초기화하고 준비합니다. 예를 들어, 네트워크 요청을 통해 데이터를 가져와서 초기화하는 작업을 수행할 수 있습니다.
  2. UI 구성: 뷰 컴포넌트의 속성, 레이아웃, 스타일 등을 설정합니다. 예를 들어, 버튼의 타이틀, 라벨의 텍스트, 텍스트 필드의 델리게이트 등을 설정할 수 있습니다.
  3. 추가적인 설정: ViewController와 관련된 설정을 수행합니다. 예를 들어, 옵저버 등록, 제스처 인식기 설정, 데이터 모델에 대한 초기화 등을 수행할 수 있습니다.

 

2. viewWillAppear()

화면 전환이 발생하거나 현재 화면이 다시 표시될 때 필요한 작업을 수행하기 위해 사용

//ViewController의 뷰가 화면에 나타나기 직전에 호출
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("View will appear")
    }
  1. 화면 전환 준비: 다른 화면으로 전환되기 전에 필요한 준비 작업을 수행합니다. 예를 들어, 다음 화면에 전달할 데이터를 준비하거나 화면 상태를 업데이트할 수 있습니다.
  2. 애니메이션 효과: 화면이 전환될 때 애니메이션 효과를 추가합니다. 예를 들어, 화면이 나타날 때 페이드 인 애니메이션을 적용하거나 객체들을 이동시키는 애니메이션을 수행할 수 있습니다.
  3. 데이터 업데이트: 다른 화면에서 돌아올 때 화면을 업데이트하거나, 외부 데이터의 변경에 따라 화면을 동적으로 갱신합니다. 예를 들어, 네트워크 요청에 응답하여 데이터를 다시 로드하거나, 사용자가 설정을 변경한 경우 해당 설정을 적용할 수 있습니다.

 

3. viewDidAppear()

화면이 완전히 보여진 상태에서 추가적인 작업을 수행하기 위해 사용

//ViewController의 뷰가 화면에 나타난 후에 호출
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("View did appear")
    }
  1. 애니메이션 시작: 화면이 나타난 후에 애니메이션 효과를 시작합니다. 예를 들어, 페이드 인 애니메이션을 실행하거나, 객체들을 움직이거나 변형시키는 애니메이션을 수행할 수 있습니다.
  2. 외부 데이터 업데이트: 화면이 나타난 후에 외부 데이터를 다시 로드하거나 업데이트합니다. 예를 들어, 네트워크 요청을 통해 최신 데이터를 가져오거나, 다른 화면에서 변경된 데이터를 반영합니다.
  3. 타이머 시작: 화면이 나타난 후에 타이머를 시작하여 주기적인 작업을 수행할 수 있습니다. 예를 들어, 화면에 실시간 데이터를 표시하거나 자동으로 업데이트하는 경우에 사용할 수 있습니다.

 

4. viewWillDisappear()

다른 화면으로 전환되거나 현재 화면이 해제될 때 필요한 정리 작업이나 데이터 저장 등을 수행하기 위해 사용

//ViewController의 뷰가 화면에서 사라지기 직전에 호출
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("View will disappear")
    }
  1. 데이터 저장: 현재 화면에 변경된 데이터를 저장하거나, 사용자 입력을 처리하여 데이터를 업데이트합니다. 예를 들어, 폼 입력 데이터를 저장하거나 설정 변경을 반영하는 작업을 수행할 수 있습니다.
  2. 네트워크 요청 중단: 화면이 사라지기 전에 진행 중인 네트워크 요청을 취소하거나 일시 중지할 수 있습니다. 예를 들어, 화면이 전환되는 동안 불필요한 네트워크 요청을 중단시키는 작업을 수행할 수 있습니다.
  3. 정리 작업: 화면에서 사용한 리소스를 정리하거나 해제합니다. 예를 들어, 옵저버 등록 해제, 타이머 중지, 메모리 해제 등의 작업을 수행할 수 있습니다.

 

5. viewDidDisappear()

화면이 완전히 사라진 후에 추가 작업을 수행하기 위해 사용

//ViewController의 뷰가 화면에서 완전히 사라진 후에 호출
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("View did disappear")
    }
  1. 리소스 해제: 화면이 사라진 후에 사용한 리소스를 해제합니다. 예를 들어, 메모리 관련 리소스를 정리하거나 객체를 해제하는 작업을 수행할 수 있습니다.
  2. 애니메이션 정리: 화면이 사라진 후에 실행 중인 애니메이션을 정리하거나 중지합니다. 예를 들어, 화면 전환에 사용한 애니메이션이 종료되었을 때 애니메이션 객체를 정리하는 작업을 수행할 수 있습니다.
  3. 데이터 초기화: 화면이 사라진 후에 초기화 작업을 수행합니다. 예를 들어, 화면이 다시 나타날 때 초기 상태로 되돌리거나, 다음 화면 전환을 위해 데이터를 초기화하는 작업을 수행할 수 있습니다.

 

6. didReceiveMemoryWarning()

메모리 부족 상황에서는 시스템이 앱에 경고 메시지를 보내고 추가적인 메모리를 확보하기 위해 앱에 대한 처리를 요청

 //메모리 부족 상황에서 호출
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        print("Memory warning")
    }
  1. 캐시 해제: 메모리를 확보하기 위해 사용하지 않는 캐시를 해제합니다. 예를 들어, 이미지나 동영상 등의 큰 데이터를 캐싱하고 있다면, didReceiveMemoryWarning()에서 해당 캐시를 비워 메모리를 확보할 수 있습니다.
  2. 임시 데이터 삭제: 임시적으로 저장한 데이터를 삭제하여 메모리를 확보합니다. 예를 들어, 화면 전환 시 임시로 저장한 데이터가 있을 경우, 해당 데이터를 제거할 수 있습니다.
  3. 불필요한 리소스 해제: 사용하지 않는 리소스를 해제하여 메모리를 확보합니다. 예를 들어, 화면 전환 시 사용하지 않는 뷰 컴포넌트나 객체를 해제할 수 있습니다.

 

마지막으로 면접에 나올만한 질문 3가지를 만들어 봤습니다.

Q: viewDidLoad()viewWillAppear()의 차이점은 무엇인가요?

더보기

A: viewDidLoad()는 ViewController의 뷰가 처음으로 메모리에 로드될 때 호출되는 메서드로, 초기 설정이나 데이터 로딩과 같은 작업을 수행합니다.

반면에 viewWillAppear()ViewController의 뷰가 화면에 나타나기 직전에 호출되는 메서드로, 화면이 나타나기 전에 필요한 설정 작업이나 데이터 업데이트를 수행하는 데 사용됩니다.

Q: viewWillDisappear()viewDidDisappear()의 차이점은 무엇인가요?

더보기

A: viewWillDisappear()ViewController의 뷰가 화면에서 사라지기 직전에 호출되는 메서드로, 다른 화면으로 전환되거나 현재 화면이 해제될 때 필요한 정리 작업이나 데이터 저장 등을 수행하는 데 사용됩니다.

반면에 viewDidDisappear()ViewController의 뷰가 화면에서 사라진 후에 호출되는 메서드로, 화면이 완전히 사라진 후에 추가 작업을 수행하는 데 사용됩니다.

Q: viewDidAppear() 메서드는 언제 호출되고 어떤 작업에 주로 사용되나요?

더보기

A: viewDidAppear() 메서드는 ViewController의 뷰가 화면에 나타난 후에 호출되는 메서드입니다.

이 메서드는 화면이 완전히 보여진 상태에서 추가적인 작업을 수행하는 데 사용됩니다.

주로 애니메이션 시작, 외부 데이터 업데이트, 타이머 시작 등에 활용됩니다.