一文读懂 iOS 程序生命周期和视图生命周期

一、程序生命周期(App Lifecycle)

关键方法及调用时机:

方法名 (Swift) 方法名 (Objective-C) 调用时机
application(_:didFinishLaunchingWithOptions:) application:didFinishLaunchingWithOptions: 应用首次启动时
applicationDidBecomeActive applicationDidBecomeActive: 应用进入前台时
applicationWillResignActive applicationWillResignActive: 应用即将进入后台时
applicationDidEnterBackground applicationDidEnterBackground: 应用完全进入后台时
applicationWillEnterForeground applicationWillEnterForeground: 应用即将回到前台时
applicationWillTerminate applicationWillTerminate: 应用即将终止时

Swift 代码示例(AppDelegate.swift):

swift 复制代码
import UIKit

@UIApplicationMain
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 Did Become Active")
    }
    
    func applicationWillResignActive(_ application: UIApplication) {
        print("App Will Resign Active")
    }
    
    func applicationDidEnterBackground(_ application: UIApplication) {
        print("App Did Enter Background")
    }
    
    func applicationWillEnterForeground(_ application: UIApplication) {
        print("App Will Enter Foreground")
    }
    
    func applicationWillTerminate(_ application: UIApplication) {
        print("App Will Terminate")
    }
}

Objective-C 代码示例(AppDelegate.m):

objectivec 复制代码
#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"App Launched");
    return YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    NSLog(@"App Did Become Active");
}

- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"App Will Resign Active");
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"App Did Enter Background");
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"App Will Enter Foreground");
}

- (void)applicationWillTerminate:(UIApplication *)application {
    NSLog(@"App Will Terminate");
}

@end

二、视图生命周期(ViewController Lifecycle)

关键方法及调用顺序:

方法名 (Swift) 方法名 (Objective-C) 调用时机
viewDidLoad() viewDidLoad 视图加载完成时(只调用一次)
viewWillAppear(_:) viewWillAppear: 视图即将显示时
viewDidAppear(_:) viewDidAppear: 视图完全显示时
viewWillDisappear(_:) viewWillDisappear: 视图即将消失时
viewDidDisappear(_:) viewDidDisappear: 视图完全消失时
viewWillLayoutSubviews() viewWillLayoutSubviews 即将布局子视图时
viewDidLayoutSubviews() viewDidLayoutSubviews 完成布局子视图时
deinit dealloc 视图控制器销毁时

Swift 代码示例(ViewController.swift):

swift 复制代码
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("View Did Load")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("View Will Appear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("View Did Appear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("View Will Disappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("View Did Disappear")
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        print("View Will Layout Subviews")
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        print("View Did Layout Subviews")
    }
    
    deinit {
        print("View Controller Deinitialized")
    }
}

Objective-C 代码示例(ViewController.m):

objectivec 复制代码
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"View Did Load");
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"View Will Appear");
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"View Did Appear");
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"View Will Disappear");
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"View Did Disappear");
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    NSLog(@"View Will Layout Subviews");
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"View Did Layout Subviews");
}

- (void)dealloc {
    NSLog(@"View Controller Deallocated");
}

@end

三、生命周期流程图

复制代码
程序启动:
didFinishLaunchingWithOptions
  → applicationDidBecomeActive

从后台回到前台:
applicationWillEnterForeground
  → applicationDidBecomeActive

进入后台:
applicationWillResignActive
  → applicationDidEnterBackground

视图控制器显示:
viewDidLoad
  → viewWillAppear
  → viewDidAppear

视图控制器消失:
viewWillDisappear
  → viewDidDisappear

四、关键场景说明

  1. viewDidLoad

    • 最佳实践:初始化界面元素、网络请求、数据加载
    • 注意:此时视图的 bounds 可能尚未确定
  2. viewDidAppear

    • 最佳实践:启动动画、定时器、位置更新
    • 注意:避免在此处执行耗时操作
  3. viewDidDisappear

    • 最佳实践:停止动画、取消网络请求、释放资源
  4. deinit/dealloc

    • 必须实现:移除通知观察者、销毁强引用对象

通过理解这些生命周期方法,开发者可以更好地控制应用状态和视图行为,实现内存管理优化和流畅的界面交互。

相关推荐
深念Y1 小时前
PVE 安装黑苹果并直通 Quadro P400
macos·ios·黑苹果·驱动·苹果·英伟达·p400
weixin-a153003083161 小时前
7.Appium-ios端自动化
ios·appium·自动化
~木雨3 小时前
Java 线程池七问七答:参数、执行流程、拒绝策略到 ThreadLocal 内存泄漏,面试必背
java·面试·线程池·threadlocal·threadpool·executor
ocean21034 小时前
2025-2026年计算机网络面试高频知识点洞察
计算机网络·面试·职场和发展·https·tcp·面试真题·秋招春招
Anhty17 小时前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机
lee_curry20 小时前
AI Agent 工程师完整学习路线(面向生产级项目与面试)
人工智能·学习·ai·面试·agent
江湖十年20 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go
数智启示录21 小时前
PostgreSQL 内存调优实战(第 12 篇):work_mem 只调大 64 倍,峰值为什么远不止 64 倍
运维·数据库·经验分享·postgresql·面试
刀法如飞1 天前
《理解道德经》简版第5章:天地不仁,以万物为刍狗
面试·机器人
wuyk5551 天前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试