iOS App生命周期管理
iOS App生命周期管理

iOS App生命周期管理

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/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注