iOS 生命周期 (最新最完整)

news2025/7/16 10:55:08

要知道APP的生命周期,首先要了解一下生命周期的5种状态,结合状态理解生命周期的使用。

一、应用的状态

应用的状态包括:

1.1 未运行(Not running)

程序没启动

1.2 未激活(Inactive)

程序在前台运行,不过没有接收到事件。
一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

1.3 激活(Active)

程序在前台运行而且接收到了事件。这也是前台的一个正常的模式

1.4 后台(Backgroud)

程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态

1.5 挂起(Suspended)

程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

二、常用的生命周期方法

APP的生命周期就是UIApplicationDelegate中的回调方法,这些方法是根据状态变化进行响应的地方,其中最常用的就是以下7个方法:

2.1 生命周期API

application:willFinishLaunchingWithOptions:
在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复

application:didFinishLaunchingWithOptions:
表示App将从未运行状态进入运行状态,用于对App的初始化操作

applicationDidBecomeActive:
当应用即将进入前台运行时调用

applicationWillResignActive:
当应用即将进从前台退出时调用

applicationDidEnterBackground:
当应用开始在后台运行的时候调用

applicationWillEnterForeground:
当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用

applicationWillTerminate:
当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。

状态之间的关系图:

在这里插入图片描述

2.2 相关方法

#pragma mark - APP 生命周期

//在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions
{
    NSLog(@"app status : willFinishLaunchingWithOptions");
    
    return YES;
}

//表示App将从未运行状态进入运行状态,用于对App的初始化操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSLog(@"app status : didFinishLaunchingWithOptions");

    return YES;
}

//当应用即将进入前台运行时调用
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSLog(@"app status : applicationDidBecomeActive");
}

//当应用即将进从前台退出时调用
- (void)applicationWillResignActive:(UIApplication *)application
{
    NSLog(@"app status : applicationWillResignActive");
}

//当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSLog(@"app status : applicationWillEnterForeground");
}

//当应用开始在后台运行的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    //NSLog(@"程序进入后台");
    NSLog(@"app status : applicationDidEnterBackground");
}

//当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存
- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"app status : applicationWillTerminate");
}

2.3 监听APP生命周期通知

- (void)applicationNotification
{
    //应用开始在后台运行的时候通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
    //当程序从后台将要重新回到前台(但是还没变成Active状态)时候通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
    //应用进入运行状态通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidFinishLaunching) name:UIApplicationDidFinishLaunchingNotification object:nil];
    //应用即将进入前台运行时通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
    //应用即将进从前台退出时通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil];
    //应用因内存警告退出通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidReceiveMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
    //双击Home键杀掉应用通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate) name:UIApplicationWillTerminateNotification object:nil];
}

- (void)applicationDidEnterBackground
{
    NSLog(@"app status : applicationDidEnterBackground");
}

- (void)applicationWillEnterForeground
{
    NSLog(@"app status : applicationWillEnterForeground");
}

- (void)applicationDidFinishLaunching
{
    NSLog(@"app status : applicationDidFinishLaunching");
}

- (void)applicationDidBecomeActive
{
    NSLog(@"app status : applicationDidBecomeActive");
}

- (void)applicationWillResignActive
{
    NSLog(@"app status : applicationWillResignActive");
}

- (void)applicationDidReceiveMemoryWarning
{
    NSLog(@"app status : applicationDidReceiveMemoryWarning");
}

- (void)applicationWillTerminate
{
    NSLog(@"app status : applicationWillTerminate");
}

三、常用的场景分析

3.1 程序启动

状态由 Not running -> Inactive -> Active

//依次调用的方法如下:
willFinishLaunchingWithOptions
didFinishLaunchingWithOptions
applicationDidBecomeActive

3.2 点击home键或者锁屏

状态由 Active -> Inactive -> Backgroud

//依次调用的方法如下:
applicationWillResignActive
applicationDidEnterBackground

3.3 重新进入前台

状态由 Backgroud -> Inactive -> Active

//依次调用的方法如下:
applicationWillEnterForeground
applicationDidBecomeActive

3.4 在前台,双击home键,手动杀掉APP

状态由 Active -> Inactive -> Backgroud -> end

//依次调用的方法如下:
applicationWillResignActive
applicationDidEnterBackground
applicationWillTerminate

3.5 当URL到达时,如果你的应用没在正在运行,则会被启动并且移到前台运行以打开URL

//依次调用的方法如下:
application:didFinishLaunchingWithOptions:
application:openURL:sourceApplication:
applicationDidBecomeActive

3.6 当URL到达时,如果你的应用正在background运行或被suspended,它将会被移到前台以打开URL

//依次调用的方法如下:
applicationWillEnterForeground
application:openURL:sourceApplication:
applicationDidBecomeActive

生命周期执行流程:

在这里插入图片描述

四、UIViewController的生命周期

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序:

1、 alloc
创建对象,分配空间
2、init (initWithNibName|initWithCoder)
初始化对象,初始化数据
3、awakeFromNib
所有视图的outlet和action已经连接,但还没有被确定。
4、loadView
完成一些关键view的初始化工作,加载view。
5、viewDidLoad
载入完成,可以进行自定义数据以及动态创建其他控件
6、viewWillAppear
视图将出现在屏幕之前
7、viewWillLayoutSubviews
将要对子视图进行调整
8、viewDidLayoutSubviews
对子视图进行调整完毕
9、viewDidAppear
视图已在屏幕上渲染完成
10、viewWillDisappear
视图将被从屏幕上移除
11、viewDidDisappear
视图已经被从屏幕上移除
12、dealloc
视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
13、didReceiveMemoryWarning
内存警告

五、UIView的生命周期

(纯代码)UIView创建为:[[UIView alloc] init];
1.initWithFrame:
2.init
3.layoutSubviews

(纯代码)UIView创建为:[[UiView alloc] initWithFrame:[UIScreen mainScreen].bounds];
1.initWithFrame:
2.layoutSubviews

(XIB)UIView创建为:NSArray *arr = [[NSBundle mainBundle] loadNibNamed:(@"XHView") owner:nil option:nil];     [arr lastObject];
1.initWithCoder:
2.awakeFromNib
3.layoutSubviews

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚医通 (二十一)预约挂号功能

目录一、预约挂号详情1、需求2、预约挂号详情接口3、预约挂号详情前端二、预约确认1、需求2、预约确认接口3、预约确认前端一、预约挂号详情 1、需求 接口分析 &#xff08;1&#xff09;根据预约周期&#xff0c;展示可预约日期数据&#xff0c;按分页展示 &#xff08;2&…

JAVA设计模式之工厂模式讲解

目录 前言 开始表演 前言 Java中使用工厂模式的主要原因是为了实现代码的灵活性和可维护性。工厂模式是一种创建型设计模式&#xff0c;它提供了一种将对象的创建和使用进行分离的方式。具体来说&#xff0c;工厂模式可以将对象的创建过程封装在一个独立的工厂类中&#xff…

自动微分记录

计算图(数据流图):AI系统化问题 - 计算图的提出 计算图和自动微分 单算子切分、图的切分和调度 前端->统一表示->优化层->运行时态->底层库 语言 计算网络模型中间表示 计算图 自动微分 计算图优化 内存管理、计算图调度和执行 内核代码优化与编译 多硬件支持…

ip-guard如何在控制台上判断策略是否下发成功?

方法1.看控制台策略设置是否带*号,一般带*,然后刷新控制台依旧带*,说明策略没下发。可以点击刷新按钮进行刷新。 方法2.运行cmd,将控制台程序拖入命令行中,加参数-ad,回车运行。 然后,选中指定客户端,在维护-命令行,输入policy,

骨传导耳机是怎么发声的,骨传导耳机值得入手嘛

现在市面上除了我们平时比较常见的有线耳机、头戴耳机、真无线耳机&#xff0c;近两年还涌现出了一种有着黑科技之称的特别耳机——骨传导耳机&#xff0c;并且因其在运动场景下的优势过于明显而得到了众多运动爱好者的大力追捧。那么今天我们就来聊聊这款所谓的黑科技骨传导耳…

webform如何升级mvc

1.创建项目 给项目起名字然后指定存储位置 选择asp.net 空项目 2.新建model namespace WebFormToMvc {/// <summary>/// 用户模型/// </summary>public class UserModel{/// <summary>/// id/// </summary>public int Id { get; set; }/// <sum…

解决Chrome浏览器内置翻译无法使用的问题

hosts文件 hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开&#xff0c;主要作用是定义IP地址和主机名的映射关系&#xff0c;是一个映射IP地址和主机名的规定。当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从hosts文件中寻找对应…

上海亚商投顾:沪指收跌0.62% 东数西算板块逆势领涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日震荡调整&#xff0c;盘中集体跌超1%&#xff0c;随后沪指跌幅有所收窄。东数西算概念午后走强&#xf…

【FLASH存储器系列二十一】如何评估固态硬盘的性能?

我们以三星消费级SSD 990 PRO为例进行介绍&#xff0c;下图为其产品配置&#xff1a; 简单说明一下产品配置&#xff1a;990 pro容量有1T和2T两种规格&#xff0c;固态硬盘容量计算一般是1T1000GB1000000MB&#xff0c;与操作系统容量计算1T1024GB不一样&#xff0c;使用M.2外形…

Editor工具开发基础三:自定义组件菜单拓展 CustomEditor

一.创建脚本路径 创建脚本路径不再限制 一般写在自定义组件类的下边二.特性CustomEditor 定义主设计图面由自定义代码实现数组的编辑器。两个构造函数1.public CustomEditor(Type inspectedType);2.public CustomEditor(Type inspectedType, bool editorForChildClasses);参数意…

[架构之路-118]-《软考-系统架构设计师》-软架构设计-11-可靠性相关设计

第11节 可靠性相关设计11.1 可靠性基本概念可靠性工程是研究产品生命周期中故障的发生、发展规律&#xff0c;达到预防故障&#xff0c;消灭故障&#xff0c;提高产品可用性的工程技术。信息系统的可靠性是指系统在满足一定条件的应用环境中能够正常工作的能力&#xff0c;可以…

如何理解「数据驱动业务」?

“数据驱动”描述了一种业务状态&#xff0c;在这种状态中&#xff0c;数据被用于实时有效地推动决策和其他相关活动。对于企业来说&#xff0c;达到数据驱动的状态就像是开车和骑马旅行的区别。数据驱动的业务能够更快、更高效地达到目标。 数据驱动特征包括质量良好的数据整…

高品质运动耳机哪款更好用、运动耳机最好的牌子推荐

在运动的时候大家都会选择戴上耳机&#xff0c;用音乐来”调味“&#xff0c;让跑步的过程不那么枯燥乏味。说到运动耳机&#xff0c;除了老生常谈的音质以外&#xff0c;耳机的材质、耳机的工艺&#xff0c;耳机的佩戴稳固性等&#xff0c;也都在影响着用户的体验&#xff0c;…

181、【动态规划】leetcode ——72. 编辑距离(C++版本)

题目描述 原题链接&#xff1a;72. 编辑距离 解题思路 动态规划五步曲&#xff1a; &#xff08;1&#xff09;dp[i][j]含义&#xff1a; 以word1[i - 1]和word2[j - 1]结尾子串&#xff0c;经过最少次增删改后&#xff0c;可让word1变为word2的步数。dp中的i对应word1中的i…

命令执行漏洞多种写入webshell方式总结

命令行写shell注意事项&#xff1a;1.注意单引号和双引号的区别&#xff1a;单引号用单引号 ’ 括起来的字符会保留引号内每个字符的字面值简而言之&#xff0c;shell 将逐字解释单引号内的封闭文本&#xff0c;并且不会插入任何内容&#xff0c;包括变量、反引号、某些 \ 转义…

内存管理框架---Slab(二)

站在Arnold Lu南京大佬的肩膀&#xff0c;俯瞰内存管理之slab 文章目录slab层的由来slab/slub/slobslab层的设计思想slab相关数据结构创建slab描述符分配slab对象释放slab对象销毁缓存在内核栈上的静态分配高端内存的映射永久映射临时映射每个CPU的分配新的每个CPU接口编译时的…

自动驾驶仿真测试介绍

作者 | 楼泽如 上海控安可信软件创新研究院研发工程师 来源 | 鉴源实验室 01 引 言 自动驾驶汽车的兴起&#xff0c;正在重新定义汽车行业。随着自动驾驶技术的发展&#xff0c;自动驾驶汽车将会大大提升交通安全、减少事故发生、减少交通拥堵、提高公路容量等等&#xff0…

我这样实现Promise

一、剖析Promise的基础框架 要实现Promise原理&#xff0c;肯定得先明白其原理。Promsie的基础框架如下&#xff1a; // 挂在原型上的方法&#xff0c;实例对象可以访问并且使用 MyPromise.prototype.then function(onResolved, onRejected) {//.then接收两个函数类型的形参…

Elasticsearch7.8.0版本进阶——文档分析 分析器

目录一、文档分析过程二、分析器三、内置分析器3.1、标准分析器3.2、简单分析器3.3、空格分析器3.4、语言分析器四、分析器使用场景五、分析器的测试示例一、文档分析过程 将一块文本分成适合于倒排索引的独立的词条。将这些词条统一化为标准格式以提高它们的“可搜索性”&…

RFID在产线上的作用

RFID在产线上的作用RFID技术应用于产线监控&#xff0c;可以实现产线的自动控制和检测。RFID读写器每识别一个产品标签&#xff0c;就可以将数据传输到电脑程序中&#xff0c;记录每1件产品的原料和来源、生产线位置、生产过程和库存状况等信息&#xff0c;为企业更好地管理生产…