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

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

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

相关推荐
I烟雨云渊T7 小时前
iOS 门店营收表格功能的实现
ios
江城开朗的豌豆9 小时前
JavaScript篇:函数间的悄悄话:callee和caller的那些事儿
javascript·面试
江城开朗的豌豆9 小时前
JavaScript篇:回调地狱退散!6年老前端教你写出优雅异步代码
前端·javascript·面试
每次的天空12 小时前
Android第十三次面试总结基础
android·面试·职场和发展
周末程序猿12 小时前
Linux高性能网络编程十谈|C++11实现22种高并发模型
后端·面试
憨憨睡不醒啊13 小时前
如何让LLM智能体开发助力求职之路——构建属于你的智能体开发知识体系📚📚📚
面试·程序员·llm
明月看潮生13 小时前
青少年编程与数学 01-011 系统软件简介 07 iOS操作系统
ios·青少年编程·操作系统·系统软件
前端小崔15 小时前
前端面试题之ES6保姆级教程
开发语言·前端·javascript·面试·职场和发展·ecmascript·es6
90后的晨仔15 小时前
RxSwift 框架解析
前端·ios
安妮的心动录16 小时前
人是习惯的结果
面试·程序员·求职