目錄
- 一、應用生命周期(App Lifecycle)
- UIKit (AppDelegate)
- SwiftUI (使用 ScenePhase)
- 二、頁面生命周期(ViewController Lifecycle)
- 三、視圖生命周期(UIView Lifecycle)
- 四、SwiftUI 視圖生命周期
- 五、關鍵對比總結
在 Swift 開發中,應用、頁面(視圖控制器)和視圖的生命周期是核心概念。以下是 iOS 開發中(UIKit 和 SwiftUI)的生命周期詳解:
一、應用生命周期(App Lifecycle)
通過 AppDelegate
或 SwiftUI 的 App
協議管理應用級事件:
UIKit (AppDelegate)
class AppDelegate: UIResponder, UIApplicationDelegate {// 應用啟動完成func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {print("App Launched")return true}// 應用進入前臺func applicationDidBecomeActive(_ application: UIApplication) {print("App Active")}// 應用進入后臺func applicationDidEnterBackground(_ application: UIApplication) {print("App Background")}// 應用即將終止func applicationWillTerminate(_ application: UIApplication) {print("App Terminated")}
}
SwiftUI (使用 ScenePhase)
@main
struct MyApp: App {@Environment(\.scenePhase) var scenePhasevar body: some Scene {WindowGroup {ContentView()}.onChange(of: scenePhase) { newPhase inswitch newPhase {case .active: print("App Active")case .inactive: print("App Inactive")case .background: print("App Background")@unknown default: break}}}
}
二、頁面生命周期(ViewController Lifecycle)
UIKit 的UIViewController
生命周期(每個方法都需調用 super
):
方法 | 調用時機 |
---|---|
init(coder:) / init(nibName:bundle:) | 控制器初始化 |
loadView() | 創建視圖層次結構(不要手動調用) |
viewDidLoad() | 視圖加載完成(只調用一次) |
viewWillAppear(_:) | 視圖即將顯示(每次進入頁面時調用) |
viewWillLayoutSubviews() | 視圖即將布局子視圖 |
viewDidLayoutSubviews() | 視圖已完成子視圖布局 |
viewDidAppear(_:) | 視圖已顯示 |
viewWillDisappear(_:) | 視圖即將消失 |
viewDidDisappear(_:) | 視圖已消失 |
deinit | 控制器銷毀 |
示例代碼:
class ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()print("View Loaded")}override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)print("View Will Appear")}override func viewDidDisappear(_ animated: Bool) {super.viewDidDisappear(animated)print("View Disappeared")}deinit {print("ViewController Deallocated")}
}
三、視圖生命周期(UIView Lifecycle)
UIKit 的UIView
關鍵方法:
方法 | 調用時機 |
---|---|
init(frame:) / init(coder:) | 視圖初始化 |
didAddSubview(_:) | 子視圖被添加 |
willRemoveSubview(_:) | 子視圖將被移除 |
willMove(toSuperview:) | 即將添加到父視圖 |
didMoveToSuperview() | 已添加到父視圖 |
layoutSubviews() | 布局子視圖(布局變更時調用) |
draw(_:) | 需要重繪內容(避免手動調用) |
removeFromSuperview() | 從父視圖移除 |
deinit | 視圖銷毀 |
示例代碼:
class CustomView: UIView {override func layoutSubviews() {super.layoutSubviews()print("Layout Subviews (e.g., frame changed)")}deinit {print("View Deallocated")}
}
四、SwiftUI 視圖生命周期
SwiftUI 使用聲明式語法,通過修飾符響應事件:
修飾符 | 作用 |
---|---|
.onAppear { } | 視圖出現時調用(類似 viewDidAppear ) |
.onDisappear { } | 視圖消失時調用(類似 viewDidDisappear ) |
.task { } | 異步任務啟動,視圖消失時自動取消 |
.onChange(of: value) { } | 狀態變化時響應 |
示例代碼:
struct ContentView: View {@State private var text = "Hello"var body: some View {Text(text).onAppear {print("SwiftUI View Appeared")// 初始化數據}.onDisappear {print("SwiftUI View Disappeared")}.task {// 異步加載數據await loadData()}.onChange(of: text) { newValue inprint("Text changed to \(newValue)")}}
}
五、關鍵對比總結
概念 | UIKit | SwiftUI |
---|---|---|
應用啟動 | application(_:didFinishLaunching...) | App 協議 + onChange(of: scenePhase) |
頁面顯示/隱藏 | viewWillAppear / viewDidAppear | .onAppear / .onDisappear |
布局更新 | layoutSubviews() | 自動響應狀態變化 |
異步任務 | 手動管理(需在 viewDidDisappear 取消) | .task 自動取消 |
銷毀 | deinit | 結構體自動釋放 |
📌 最佳實踐:
- UIKit:在
viewDidLoad
中初始化數據,在viewWillAppear
中刷新 UI。 - SwiftUI:用
.onAppear
替代viewDidLoad
+viewWillAppear
,用.task
處理異步。 - 避免在
layoutSubviews()
中做耗時操作(可能頻繁調用)。
掌握這些生命周期可避免內存泄漏、優化性能并確保正確的數據加載時機。