[iOS] View Lifecycle (뷰 생명 주기)

2025. 1. 19. 19:35iOS

반응형

iOS 앱 개발에서 **뷰 생명 주기(View Lifecycle)**는 앱에서 화면을 구성하는 **뷰(View)**가 생성되고, 업데이트되며, 소멸되는 과정을 설명하는 중요한 개념입니다. 각 뷰가 언제 생성되고, 언제 화면에 표시되며, 언제 소멸되는지 이해하는 것은 앱의 성능 최적화와 버그 수정에 필수적입니다.

iOS에서는 UIViewController를 중심으로 뷰 생명 주기가 관리됩니다. UIViewController는 **뷰 컨트롤러(View Controller)**라고도 불리며, 이는 화면을 구성하는 뷰를 관리하고, 사용자와 상호작용을 처리하는 객체입니다. 뷰 컨트롤러는 각기 다른 생명 주기 메서드를 통해 뷰의 상태 변화를 관리합니다. 이 메서드들은 뷰가 생성되었을 때, 뷰가 화면에 나타날 때, 뷰가 사라질 때 등을 처리하는 중요한 역할을 합니다.

1. 뷰 생명 주기의 주요 메서드

iOS에서 뷰 컨트롤러는 뷰가 화면에 표시되기 전에 여러 가지 상태 변화를 겪습니다. 이러한 상태 변화는 주로 뷰 컨트롤러의 뷰 생명 주기 메서드를 통해 관리됩니다. 아래는 주요 메서드들의 설명입니다.

1) loadView

loadView는 뷰 컨트롤러의 뷰가 메모리에 로드되기 직전에 호출됩니다. 이 메서드는 기본적으로 자동으로 호출되며, 일반적으로 뷰 컨트롤러의 뷰를 수동으로 초기화하고 설정할 때 사용됩니다. loadView 메서드는 UIViewController의 기본 뷰 생성 방식(view 프로퍼티에 할당된 기본값)을 변경하려는 경우에 유용합니다. 예를 들어, 스토리보드를 사용하지 않고 코드로만 뷰를 설정하려면 이 메서드를 오버라이드하여 뷰를 생성해야 합니다.

예시

override func loadView() { 
	super.loadView() 
    let customView = CustomView() 
    self.view = customView 
}

2) viewDidLoad

viewDidLoad는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출됩니다. 이 메서드는 뷰가 화면에 표시되기 전에 초기화 작업을 하는 데 적합한 메서드입니다. 예를 들어, 데이터 로딩이나 UI 초기화와 같은 작업을 이 메서드에서 수행할 수 있습니다. viewDidLoad는 뷰가 메모리에 로드되었을 때 한 번만 호출되며, 이후에는 다시 호출되지 않습니다.

예시

override func viewDidLoad() { 
	super.viewDidLoad() 
    // UI 초기화 및 데이터 설정 
    fetchData() 
}

3) viewWillAppear

viewWillAppear는 뷰 컨트롤러의 뷰가 화면에 나타나기 직전에 호출됩니다. 이 메서드는 뷰가 표시되기 전에 해야 할 작업들을 처리하는 데 적합합니다. 예를 들어, UI 업데이트, 애니메이션 준비 등을 처리할 수 있습니다. 이 메서드는 뷰가 화면에 나타날 때마다 호출됩니다.

예시

override func viewWillAppear(_ animated: Bool) { 
	super.viewWillAppear(animated) 
    // 뷰가 나타나기 전에 UI 업데이트 
    updateUI() 
}
 

4) viewDidAppear

viewDidAppear는 뷰가 화면에 완전히 표시된 후에 호출됩니다. 이 메서드는 뷰가 완전히 로드되고 표시된 후에 실행할 작업들을 처리하는 데 적합합니다. 예를 들어, 화면에 표시된 후에 애니메이션 시작이나 데이터 표시와 같은 작업을 할 수 있습니다.

예시

override func viewDidAppear(_ animated: Bool) { 
	super.viewDidAppear(animated) 
    // 뷰가 화면에 나타난 후 애니메이션 시작 
    startAnimation() 
}

5) viewWillDisappear

viewWillDisappear는 뷰가 화면에서 사라지기 직전에 호출됩니다. 이 메서드는 뷰가 화면에서 사라지기 전에 해야 할 작업을 처리하는 데 적합합니다. 예를 들어, 데이터 저장, 리소스 해제 등을 이 시점에서 처리할 수 있습니다. 이 메서드는 뷰가 화면에서 사라질 때마다 호출됩니다.

예시

override func viewWillDisappear(_ animated: Bool) { 
	super.viewWillDisappear(animated) 
    // 화면에서 사라지기 전에 리소스 해제 
    stopAnimation() 
}

6) viewDidDisappear

viewDidDisappear는 뷰가 화면에서 완전히 사라진 후에 호출됩니다. 이 메서드는 뷰가 화면에서 사라진 후에 수행할 작업을 처리하는 데 적합합니다. 예를 들어, 데이터 저장 완료UI 업데이트 종료 등을 할 수 있습니다.

예시

override func viewDidDisappear(_ animated: Bool) { 
	super.viewDidDisappear(animated) 
    // 화면에서 사라진 후 데이터 저장 
    saveData() 
}

2. 뷰 생명 주기의 흐름

뷰 생명 주기의 흐름을 이해하는 것이 중요합니다. 아래는 **UIViewController**의 주요 생명 주기 메서드가 호출되는 순서입니다.

  1. loadView: 뷰가 메모리에 로드되기 전, 뷰 컨트롤러의 뷰를 초기화합니다.
  2. viewDidLoad: 뷰가 메모리에 로드된 후, 초기 설정을 위해 호출됩니다.
  3. viewWillAppear: 뷰가 화면에 나타나기 직전에 호출됩니다.
  4. viewDidAppear: 뷰가 화면에 완전히 나타난 후 호출됩니다.
  5. viewWillDisappear: 뷰가 화면에서 사라지기 직전에 호출됩니다.
  6. viewDidDisappear: 뷰가 화면에서 사라진 후 호출됩니다.

3. 뷰 생명 주기와 관련된 추가 메서드

1) didReceiveMemoryWarning

didReceiveMemoryWarning은 메모리가 부족할 때 호출되는 메서드입니다. 이 메서드는 시스템이 메모리 경고를 보낼 때마다 호출되며, 메모리를 절약하기 위해 불필요한 리소스 해제 등을 할 수 있는 기회를 제공합니다.

예시

override func didReceiveMemoryWarning() { 
	super.didReceiveMemoryWarning() 
    // 메모리 경고 발생 시 리소스 해제 
    freeUpMemory() 
}
 

2) traitCollectionDidChange

이 메서드는 기기의 방향 변경, 다크 모드/라이트 모드 변경 등의 UI 환경 변화가 있을 때 호출됩니다. 이를 통해 UI의 변경을 관리할 수 있습니다.

예시

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { 
	super.traitCollectionDidChange(previousTraitCollection) 
    // UI 환경 변화 처리 (예: 다크모드, 폰트 크기 변화 등) 
    adjustForTraitChange() 
}

4. 스토리보드와 뷰 생명 주기

스토리보드를 사용할 때는, 스토리보드에 설정된 뷰가 자동으로 메모리에 로드되고 관리됩니다. 이 경우, 뷰 컨트롤러의 생명 주기 메서드는 자동으로 호출되며, 추가적으로 **세그웨이(segue)**를 사용하여 화면을 전환할 수 있습니다.

스토리보드에서 뷰 컨트롤러를 추가한 경우, 해당 뷰 컨트롤러의 **viewDidLoad**가 자동으로 호출되며, **viewWillAppear**와 **viewDidAppear**는 화면 전환 시마다 호출됩니다.

5. 뷰 생명 주기를 관리하는 팁

  1. UI 업데이트는 viewWillAppear 또는 viewDidAppear에서 처리: 뷰가 화면에 표시될 때마다 UI를 업데이트하려면, viewWillAppear나 viewDidAppear 메서드를 사용하여 최신 상태를 반영하는 것이 좋습니다.
  2. 데이터 로딩은 viewDidLoad에서 처리: 초기 데이터 로딩은 viewDidLoad에서 수행하고, 뷰가 나타날 때마다 데이터를 새로고침할 필요가 없으면, 이 메서드에서만 한 번 처리합니다.
  3. 메모리 관리: 뷰가 사라질 때 메모리 관리를 철저히 해야 하므로, viewWillDisappear에서 리소스를 해제하고, viewDidDisappear에서 필요한 후속 작업을 수행합니다.

결론적으로, iOS에서 뷰 생명 주기는 앱 개발에서 매우 중요한 개념입니다. 각 메서드가 호출되는 순서를 정확히 이해하고, 각 시점에서 해야 할 일을 적절히 처리하는 것이 앱의 성능을 최적화하고, 사용자 경험을 향상시키는 데 큰 도움이 됩니다.

반응형

'iOS' 카테고리의 다른 글

[iOS] Singleton (싱글톤) 패턴  (0) 2025.01.19
[iOS] App Lifecycle (앱 생명 주기)  (1) 2025.01.19
[iOS] Memory Leak (메모리 누수)  (0) 2025.01.19
[iOS] Thread Safety  (0) 2025.01.19
[iOS] Concurrency(동시성)  (1) 2025.01.19