swift开发,关于应用、页面、视图的生命周期
目录
- 一、应用生命周期(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()
中做耗时操作(可能频繁调用)。
掌握这些生命周期可避免内存泄漏、优化性能并确保正确的数据加载时机。