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

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

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

相关推荐
2601_949950633 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
时间的拾荒人4 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
海绵宝宝转agent4 小时前
MySql高频面试八股开源笔记总结
mysql·面试·开源
小呆呆6665 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
lsc_blog6 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘
时间的拾荒人7 小时前
Qt 事件机制全解析:从事件处理到事件过滤器
开发语言·qt·面试
(Charon)8 小时前
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效
c++·面试
考研保研资料分享10 小时前
电气工程保研经验:夏令营失利后上岸上交,科研追问与九推复习(2024)
面试
时间的拾荒人10 小时前
Qt 窗口系统详解:从菜单栏到对话框的完整指南
开发语言·qt·面试