iOS 的生命周期管理涉及多个层次,包括 App 的生命周期、窗口(Scene)生命周期、视图控制器(ViewController)生命周期,以及视图(View)本身的生命周期。在现代 iOS 开发中,这些概念在 UIKit 和 SwiftUI 中略有不同。先从 UIKit 开始讲解,再补充 SwiftUI 的差异。
一、UIKit 中的生命周期管理概览
1、App 生命周期(由 UIApplicationDelegate 管理)
AppDelegate 是iOS应用的代理类,全名是 UIApplicationDelegate 协议的实现类,用于响应整个App的生命周期事件。
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
常用方法:
1、application(_:didFinishLaunchingWithOptions:):App 启动完成。
2、applicationDidBecomeActive(_:):进入前台、活跃状态。
3、applicationWillResignActive(_:):将进入后台或来电等中断。
4、applicationDidEnterBackground(_:):已进入后台。
5、applicationWillEnterForeground(_:):即将进入前台。
6、applicationWillTerminate(_:):App 被终止前(用户杀掉)。
在iOS 13引入UIScene 多窗口架构,将 UI 生命周期(如窗口、视图控制器的创建)拆分到了 SceneDelegate 中。可以通过阅读《iOS代理类AppDelegate》了解更多信息。
2、Scene 生命周期(iOS 13+,由 SceneDelegate 管理)
在iOS 13中通过SceneDelegate管理「多窗口」的生命周期和 UI 设置。
class SceneDelegate: UIResponder, UIWindowSceneDelegate
常用方法:
1、scene(_:willConnectTo:options:):连接场景,设置 UI。
2、sceneDidBecomeActive(_:):场景活跃(进入前台)。
3、sceneWillResignActive(_:):场景将失活(切后台等)。
4、sceneWillEnterForeground(_:):场景从后台回前台。
5、sceneDidEnterBackground(_:):场景进入后台。
和 AppDelegate 分工合作 —— AppDelegate 管全局的 App 生命周期,SceneDelegate 管一个具体 UI 界面的生命周期(比如一个窗口或屏幕内容)。可以通过阅读《iOS管理多窗口的SceneDelegate》了解更多信息。
3、ViewController 生命周期(管理一个具体页面)
用来表示一个屏幕上的界面或页面。在App 中,每一个界面(比如设置页、详情页、登录页)背后其实都是一个 UIViewController 或其子类。
class MyViewController: UIViewController
生命周期方法:
1、init():初始化。
2、loadView():创建视图(不常重写)。
3、viewDidLoad():视图加载完成,一般用于 UI 初始化。
4、viewWillAppear(_:):即将显示(每次出现都调用)。
5、viewDidAppear(_:):已经显示。
6、viewWillDisappear(_:):即将消失。
7、viewDidDisappear(_:):已经消失。
8、deinit:控制器释放,常用于清理资源。
可以通过阅读《SwiftUI和iOS核心类UIViewController》了解更多信息。
4、UIView
class MyCustomView: UIView
常用方法:
1、init(frame:):创建时调用。
2、awakeFromNib():从 nib 或 storyboard 加载后。
3、layoutSubviews():每次布局更新时调用。
4、draw(_:):绘制视图内容(性能较低,慎用)。
5、deinit:销毁时调用(如果是手动管理的)。
二、SwiftUI 生命周期(使用 @main 和 App 协议)
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
SwiftUI 中没有明显的 AppDelegate、SceneDelegate,生命周期由这些 modifiers 管理:
.onAppear { }:视图出现时调用(类似 viewDidAppear)。
.onDisappear { }:视图消失时调用。
@Environment(\.scenePhase):监听 app 状态(前台/后台等)。
@Environment(\.scenePhase) var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { newPhase in
switch newPhase {
case .active:
print("App 活跃")
case .inactive:
print("App 失活")
case .background:
print("App 后台")
@unknown default:
break
}
}
}
三、iOS 生命周期之间的关系
1、UIApplication:在App启动后,首先创建UIApplication(App),它是一个全局应用对象,只有一个实例(UIApplication.shared)。
2、AppDelegate:系统启动UIApplication实例后,会将AppDelegate设置成它的代理,由AppDelegate接管系统发来的生命周期回调事件。
3、SceneDelegate:在iOS 13+版本中,SceneDelegate管理每个窗口(Scene)的生命周期。
4、UIWindw:设置rootViewController,它本身没有生命周期方法,但是它可以触发AppDelegate、SceneDelegate和UIViewController等方法。
5、ViewController:控制视图的显示、消失、加载。
6、用户操作或跳转页面,会创建新的ViewController生命周期。
7、App切换前后台(Scene生命周期)或终止(AppDelegate)。
为什么生命周期之间没有SwiftUI?
因为 SwiftUI 是构建 UI 的一种新方式,而生命周期的核心机制仍然依赖于 UIKit 框架(也就是 UIApplication、AppDelegate、SceneDelegate、UIViewController 等)。
SwiftUI 引入了自己的一套生命周期入口点,但这并没有替代底层的 UIKit 生命周期:
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
这个 @main 是 SwiftUI 应用的“新入口”,替代了过去的 AppDelegate。但实际上系统仍然隐式地配置了一个 UIApplicationDelegate 和 SceneDelegate。
可以通过 SwiftUI 提供的 API“接入”这些生命周期:
@main
struct MyApp: App {
@Environment(\.scenePhase) var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { newPhase in
switch newPhase {
case .active:
print("App is active")
case .inactive:
print("App is inactive")
case .background:
print("App is in background")
@unknown default:
break
}
}
}
}
这是 SwiftUI 封装的 SceneDelegate 生命周期变更的监听方式。
总结
App:使用UIApplicationDelegate(AppDelegate)类,控制App的启动、终止、活跃等信息。
窗口:使用UIWindowSceneDelegate(SceneDelegate)类,在 iOS 13+ 版本中,控制多窗口生命周期。
页面:使用UIViewController类,控制每个页面的加载/显示/隐藏等内容。
视图:使用UIView类,控制视图的初始化、布局和绘制等内容。
SwiftUI App:通过@main struct App入口,在 iOS 14+ 版本中管理App 生命周期和多窗口等内容。
相关文章
1、SwiftUI和iOS核心类UIViewController:https://fangjunyu.com/2025/05/19/swiftui%e5%92%8cios%e6%a0%b8%e5%bf%83%e7%b1%bbuiviewcontroller/
2、iOS代理类AppDelegate:https://fangjunyu.com/2025/05/20/ios%e4%bb%a3%e7%90%86%e7%b1%bbappdelegate/
3、iOS管理多窗口的SceneDelegate:https://fangjunyu.com/2025/05/20/ios%e7%ae%a1%e7%90%86%e5%a4%9a%e7%aa%97%e5%8f%a3%e7%9a%84scenedelegate/
4、SwiftUI和iOS核心类UIViewController:https://fangjunyu.com/2025/05/19/swiftui%e5%92%8cios%e6%a0%b8%e5%bf%83%e7%b1%bbuiviewcontroller/
5、iOS窗口容器UIWindow:https://fangjunyu.com/2025/05/20/ios%e7%aa%97%e5%8f%a3%e5%ae%b9%e5%99%a8uiwindow/
6、SwiftUI监听应用生命周期变化的scenePhase:https://fangjunyu.com/2024/12/14/swiftui%e7%9b%91%e5%90%ac%e5%ba%94%e7%94%a8%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f%e5%8f%98%e5%8c%96%e7%9a%84scenephase/
7、iOS界面UIView:https://fangjunyu.com/2025/05/20/ios%e7%95%8c%e9%9d%a2uiview/