본문 바로가기
iOS/Swift

[iOS] ViewLife Cycle (UIKit vs SwiftUI)

by Bokoo14 2024. 5. 20.

UIKit 뷰 컨트롤러 라이프사이클

  • 명령형: 각 단계에서 직접 코드 실행
  • 수동 관리: 개발자가 직접 생명주기 제어
  • 세분화: 6개의 주요 단계로 세분화
  • 메모리 관리: 수동으로 retain cycle 관리 필요
class ViewController: UIViewController {
     // 1. 뷰 로드 단계
     override func loadView() {
         // 뷰를 코드로 생성할 때만 오버라이드
         // 스토리보드 사용 시 호출하지 말 것
         super.loadView() // 주의: 스토리보드 사용 시만
     }
     
     // 2. 뷰 로드 완료
     override func viewDidLoad() {
         super.viewDidLoad()
         // 뷰가 메모리에 로드된 후 한 번만 호출
         // UI 초기 설정, 데이터 초기화
     }
     
     // 3. 뷰 나타나기 직전
     override func viewWillAppear(_ animated: Bool) {
         super.viewWillAppear(animated)
         // 뷰가 나타날 때마다 호출
         // 네트워크 요청, 타이머 시작
     }
     
     // 4. 뷰 나타남 완료
     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
         // 뷰가 완전히 나타난 후
         // 애니메이션 시작, 위치 서비스 시작
     }
     
     // 5. 뷰 사라지기 직전
     override func viewWillDisappear(_ animated: Bool) {
         super.viewWillDisappear(animated)
         // 다른 뷰로 이동하기 직전
         // 데이터 저장, 타이머 정지
     }
     
     // 6. 뷰 사라짐 완료
     override func viewDidDisappear(_ animated: Bool) {
         super.viewDidDisappear(animated)
         // 뷰가 완전히 사라진 후
         // 리소스 정리
     }
     
     // 7. 메모리 해제
     deinit {
         // 뷰 컨트롤러가 메모리에서 해제될 때
         // 노티피케이션 해제, 강한 참조 해제
     }
 }

 

1. loadView

  • 뷰를 메모리에 로드할 때 호출
  • 스토리보드 없이 프로그래밍 방식으로 뷰를 생성할 때 오버라이드
  • 절대 super 호출하면 안됨 

2. viewDidLoad

  • 뷰가 메모리에 로드된 후 호출
  • 한 번만 호출
  • 초기 설정, IBOutlet 연결, 데이터 초기화 등

3. viewWillAppear(_:)

  • 뷰가 화면에 나타나기 직전 호출
  • 뷰가 보일 때마다 호출
  • 네비게이션 바 설정, 타이머 시작 등

4. viewDidAppear(_:)

  • 뷰가 화면에 완전히 나타난 후 호출
  • 애니메이션 시작, 위치 서비스 시작 등

5. viewWillDisappear(_:)

  • 뷰가 화면에서 사라지기 직전 호출
  • 사용자 입력 저장, 타이머 정지 등

6. viewDidDisappear(_:)

  • 뷰가 화면에서 완전히 사라진 후 호출
  • 리소스 해제, 정리 작업 등

 

SwiftUI 뷰 라이프사이클

  • 선언형: 상태 변화에 따라 자동 업데이트
  • 자동 관리: 프레임워크가 생명주기 관리
  • 단순화: onAppear/onDisappear 위주
  • 상태 중심: @State, @ObservedObject 등으로 상태 관리
struct ContentView: View {
    @State private var count = 0
    
    var body: some View {
        VStack {
            Text("Count: \(count)")
                .onAppear {
                    // 뷰가 나타날 때
                    print("View appeared")
                }
                .onDisappear {
                    // 뷰가 사라질 때
                    print("View disappeared")
                }
        }
    }
}
struct DetailView: View {
    @StateObject private var viewModel = DetailViewModel()
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some View {
        VStack {
            Text("Detail View")
        }
        .onAppear {
            viewModel.loadData()
        }
        .onDisappear {
            viewModel.cleanup()
        }
        .onChange(of: scenePhase) { phase in
            switch phase {
            case .active:
                print("App became active")
            case .inactive:
                print("App became inactive")
            case .background:
                print("App went to background")
            @unknown default:
                break
            }
        }
    }
}

 

1. onAppear

  • 뷰가 화면에 나타날 때 호출
  • UIKit의 viewWillAppear와 유사

2. onDisappear

  • 뷰가 화면에서 사라질 때 호출
  • UIKit의 viewWillDisappear와 유사

3. init

  • 뷰 구조체 초기화
  • 상태 변수 초기화

4. body 계산

  • 상태가 변경될 때마다 호출
  • 뷰 계층 구조 반환

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

[SwiftUI] @State, @Binding, Projected Value  (0) 2026.03.08
[Combine] throttle와 debounce  (0) 2025.05.20
[CS] 동기(Sync), 비동기(Async)  (2) 2024.02.16
[Swift] ARC (Automatic Reference Counting)  (0) 2024.02.16
[Swift] Swift란?  (0) 2024.02.12