一文读懂 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

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

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

相关推荐
每次的天空1 小时前
Android第四次面试总结(基础算法篇)
android·算法·面试
海姐软件测试1 小时前
接口和压测工具都有哪些,是如何选择的?
测试工具·面试·职场和发展
拉不动的猪2 小时前
刷刷题39(同一组件中的不同的标签页如何实现通信)
前端·javascript·面试
拉不动的猪2 小时前
刷刷题37(vue3的优化点)
前端·javascript·面试
uhakadotcom2 小时前
使用阿里云PyODPS3和MaxFrame构建高效本地开发环境
后端·面试·github
uhakadotcom3 小时前
YOLOv12:提升性能和新能力的目标检测模型
后端·面试·github
Aphasia3113 小时前
面试题整合——html篇
面试·html
uhakadotcom5 小时前
FPGA编程语言入门:从基础到实践
后端·面试·github
米西米西5 小时前
iOS/Swift 头像轮播组件
ios