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

683 阅读2分钟

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

关键方法及调用时机:

方法名 (Swift)方法名 (Objective-C)调用时机
application(_:didFinishLaunchingWithOptions:)application:didFinishLaunchingWithOptions:应用首次启动时
applicationDidBecomeActiveapplicationDidBecomeActive:应用进入前台时
applicationWillResignActiveapplicationWillResignActive:应用即将进入后台时
applicationDidEnterBackgroundapplicationDidEnterBackground:应用完全进入后台时
applicationWillEnterForegroundapplicationWillEnterForeground:应用即将回到前台时
applicationWillTerminateapplicationWillTerminate:应用即将终止时

Swift 代码示例(AppDelegate.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):

#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完成布局子视图时
deinitdealloc视图控制器销毁时

Swift 代码示例(ViewController.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):

#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

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

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