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
}
}
}
}