IOS-生命周期-Swift

目录

  • App生命周期
    • 应用状态
      • 未运行——Not running
      • 未激活——Inactive
      • 激活——Active
      • 后台——Backgroud
      • 挂起——Suspended
    • 关系图
    • 生命周期方法
      • 相关方法
      • 注意
      • 在其他地方监听
  • ViewController生命周期
  • UIView生命周期

App生命周期

应用状态

App主要有五种状态,分别是:

未运行——Not running

应用程序没启动

未激活——Inactive

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

激活——Active

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

后台——Backgroud

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

挂起——Suspended

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

关系图

在这里插入图片描述

生命周期方法

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

application:willFinishLaunchingWithOptions:App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复application:didFinishLaunchingWithOptions:
表示App将从未运行状态进入运行状态,用于对App的初始化操作applicationDidBecomeActive:
当应用即将进入前台运行时调用applicationWillResignActive:
当应用即将进从前台退出时调用applicationDidEnterBackground:
当应用开始在后台运行的时候调用applicationWillEnterForeground:
当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用applicationWillTerminate:
当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。

相关方法

AppDelegate实现了UIApplicationDelegate,有以下方法可供测试:

	//在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {print("willFinishLaunchingWithOptions")print("——应用开始加载——")return true}//表示App将从未运行状态进入运行状态,用于对App的初始化操作func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// Override point for customization after application launch.print("调用:didFinishLaunchingWithOptions")print("——应用开始运行——")return true}//当应用即将进入前台运行时调用func applicationDidBecomeActive(_ application: UIApplication) {print("调用:applicationDidBecomeActive")print("——应用即将进入前台——")}//当应用即将进从前台退出时调用func applicationWillResignActive(_ application: UIApplication) {print("调用:applicationWillResignActive")print("——应用即将从前台退出——")}//当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用func applicationWillEnterForeground(_ application: UIApplication) {print("调用:applicationWillEnterForeground")print("——应用即将从后台进入前台——")}//当应用开始在后台运行的时候调用func applicationDidEnterBackground(_ application: UIApplication) {print("调用:applicationDidEnterBackground")print("——应用开始在后台运行——")}//当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存func applicationWillTerminate(_ application: UIApplication) {print("调用:applicationWillTerminate")print("——应用即将终止——")}

注意

在这里插入图片描述

虽然都有这些方法,但是我实测下来,在AppDelegate种有的方法并没有打印信息,也就说明没有被调用。

applicationDidBecomeActiveapplicationWillResignActiveapplicationWillEnterForegroundapplicationDidEnterBackground

这几个方法并没有打印信息,不管我如何在前台或者后台。因此,我又在SceneDelegate中找到了对应的方法:

func sceneDidBecomeActive(_ scene: UIScene) {// Called when the scene has moved from an inactive state to an active state.// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.print("调用:applicationDidBecomeActive")print("——应用即将进入前台——")}func sceneWillResignActive(_ scene: UIScene) {// Called when the scene will move from an active state to an inactive state.// This may occur due to temporary interruptions (ex. an incoming phone call).print("调用:applicationWillResignActive")print("——应用即将从前台退出——")}func sceneWillEnterForeground(_ scene: UIScene) {// Called as the scene transitions from the background to the foreground.// Use this method to undo the changes made on entering the background.print("调用:applicationWillEnterForeground")print("——应用即将从后台进入前台——")}func sceneDidEnterBackground(_ scene: UIScene) {// Called as the scene transitions from the foreground to the background.// Use this method to save data, release shared resources, and store enough scene-specific state information// to restore the scene back to its current state.print("调用:applicationDidEnterBackground")print("——应用开始在后台运行——")}

在这里插入图片描述
这次就完整的打印了生命周期方法,操作依次是:运行、按一次Home键返回桌面、重新进入App、双击Home键然后Kill掉应用。

在其他地方监听

除了在AppDelegate和SceneDelegate中可以监听生命周期之外,还可以在ViewController等地方监听,代码如下:

	func applicationNotification() {//应用开始在后台运行的时候通知NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)//当程序从后台将要重新回到前台(但是还没变成Active状态)时候通知NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)//应用进入运行状态通知NotificationCenter.default.addObserver(self, selector: #selector(applicationDidFinishLaunching), name: UIApplication.didFinishLaunchingNotification, object: nil)//应用即将进入前台运行时通知NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)//应用即将进从前台退出时通知NotificationCenter.default.addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplication.willResignActiveNotification, object: nil)//应用因内存警告退出通知NotificationCenter.default.addObserver(self, selector: #selector(applicationDidReceiveMemoryWarning), name: UIApplication.didReceiveMemoryWarningNotification, object: nil)//双击Home键杀掉应用通知NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminate), name: UIApplication.willTerminateNotification, object: nil)}@objc func applicationDidEnterBackground() {print("app status : applicationDidEnterBackground——APP开始在后台运行")}@objc func applicationWillEnterForeground() {print("app status : applicationWillEnterForeground——APP从后台重新进入前台")}@objc func applicationDidFinishLaunching() {print("app status : applicationDidFinishLaunching——APP进入运行状态")}@objc func applicationDidBecomeActive() {print("app status : applicationDidBecomeActive——APP即将进入前台")}@objc func applicationWillResignActive() {print("app status : applicationWillResignActive——APP即将从前台退出")}@objc func applicationDidReceiveMemoryWarning() {print("app status : applicationDidReceiveMemoryWarning——APP因内存警告退出")}@objc func applicationWillTerminate() {print("app status : applicationWillTerminate——APP应用将被终止")}

结果如图:
在这里插入图片描述

ViewController生命周期

常用的控制器生命周期方法如下:

	override func viewDidLoad() {super.viewDidLoad()print("viewDidLoad-当视图控制器的视图加载完成后调用")}override func viewWillAppear(_ animated: Bool) {print("viewWillAppear-当视图即将显示在屏幕上时调用")}override func viewWillLayoutSubviews() {print("viewWillLayoutSubviews-将要对子视图进行调整")}override func viewDidLayoutSubviews() {print("viewDidLayoutSubviews-对子视图调整完毕")}override func viewDidAppear(_ animated: Bool) {print("viewDidAppear-当视图已经显示在屏幕上时调用")}override func viewWillDisappear(_ animated: Bool) {print("viewWillDisappear-当视图即将从屏幕上消失时调用")}override func viewDidDisappear(_ animated: Bool) {print("viewDidDisappear-当视图已经从屏幕上消失时调用")}override func didReceiveMemoryWarning() {print("didReceiveMemoryWarning-当系统内存不足时调用")}

结果如图:
在这里插入图片描述

UIView生命周期

UIView常用的生命周期方法如下:

import Foundation
import UIKitclass Button:UIButton{override func willRemoveSubview(_ subview: UIView) {super.willRemoveSubview(subview)print("willRemoveSubview-当子视图从本视图移除时调用")}override func willMove(toSuperview newSuperview: UIView?) {super.willMove(toSuperview: newSuperview)print("willMove-当视图即将加入父视图时 / 当视图即将从父视图移除时调用")}override func didMoveToSuperview() {super.didMoveToSuperview()print("didMoveToSuperview-当视图加入父视图时 / 当视图从父视图移除时调用")}override func willMove(toWindow newWindow: UIWindow?) {super.willMove(toWindow: newWindow)print("willMove-当视图即将加入window视图时 / 当视图即将从window视图移除时调用")}override func didMoveToWindow() {super.didMoveToWindow()print("didMoveToWindow-当视图加入window视图时 / 当视图从window视图移除时调用")}override func didAddSubview(_ subview: UIView) {super.didAddSubview(subview)print("didAddSubview-当视图添加子视图时调用")}
}

这里是通过创建一个自定义的按钮监听,然后使用:

    var button:Button!override func viewDidLoad() {super.viewDidLoad()button=Button(frame: CGRect(x: 100, y: 100, width: 100, height: 80))button.backgroundColor=UIColor.orangebutton.setTitle("按钮", for: .normal)self.view.addSubview(button)button.addTarget(self, action: #selector(click), for: UIControl.Event.touchUpInside)}@objc func click(){button.removeFromSuperview()}

点击按钮然后将其从父布局中移除,结果如下:
在这里插入图片描述
参考链接:iOS 生命周期 (最新最完整)

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

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

相关文章

Axure RP 9 动态面板

目录 轮播图绘制 多种方式登录 前言: 轮播图绘制、多种方式登录界面绘制 轮播图绘制 首先绘制一个动态面板 在概要区域选中动态面板进入State1面板中插入图片绘制 双击图片绘制插入本地图片,右键State1重复状态并更改图片 点击交互面板新建交互将需要添加…

RuoYi-Cloud本地部署--详细教程

文章目录 1、gitee项目地址2、RuoYi-Cloud架构3、本地部署3.1 下载项目3.2 idea打开项目3.3 启动nacos3.4 若依数据库准备3.5 启动redis3.6 修改nacos中的各个模块的配置文件3.7 启动ruoyi前端项目3.8 启动各个微服务模块 4、启动成功 1、gitee项目地址 https://gitee.com/y_p…

http网络编程——在ue5中实现文件传输功能

http网络编程在ue5中实现 需求:在unreal中实现下载功能,输入相关url网址,本地文件夹存入相应文件。 一、代码示例 1.Build.cs需要新增Http模块,样例如下。 PublicDependencyModuleNames.AddRange(new string[] { "Core&q…

锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计 采用新型PatchTST时间序列模型预测锂电池SOC,送锂电池数据集 可替换数据集,实现负荷预测、流量预测、降雨量预测、空气质量预测等其他多种…

k8s之ingress

ingress基于域名进行映射,把url(http https)的请求转发到service,再由service把请求转发到每一个pod ingress只要一个或者少量的公网ip或者LB,可以把多个http请求暴露到外网,七层反向代理 理解为service的service,是…

OSPF基础华为ICT网络赛道

6.1.OSPF协议概述 由协议之中OSPF(Open Shortest Path First,开放式最短路径优先)协议是使用场 景非常广泛的动态路由协议之一。 OSPF在RFC2328中定义,是一种基于链路状态算法的路由协议。 静态路由是由工程师手动配置和维护的路由条目,命令行简单明确…

年末怒赚一笔,程序员快码住!趁热接单

元旦已过,龙年将至。 有钱没钱,回家过年。 话说回来,年关将至,农历的2023即将落下帷幕。天气渐寒,你的钱包是否也让你心生寒意?年初立下的赚钱flag是否优雅地实现了? 如果flag都倒了,你先别…

【数据结构】从顺序表到ArrayList类

文章目录 1.线性表1.1线性表的概念2.顺序表2.1顺序表的概念2.2顺序表的实现2.3接口的实现(对数组增删查改操作)3.ArrayList简介4. ArrayList使用 4.1ArrayList的构造4.2 ArrayList的方法4.3 ArrayList的遍历 1.线性表 1.1线性表的概念 线性表(linear list&#xf…

微信怎么设置自动回复?教程来咯!

自动回复信息 你有没有为了回复微信消息,中断工作进度,耽误了大量时间?或者错过了潜在客户?现在,我们的微信管理系统,可以帮助你在第一时间,实时回复用户消息。 01 # 通过好友自动打招呼# 我们…

CTF CRYPTO 密码学-5

题目名称:山岚 题目描述: 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程: Step1:根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间,看出都是每3个字符的第1…

springboot集成tess4j

spring整合tess4j用于OCR识别图片&#xff0c;在windows环境识别正常&#xff0c;在liunx没有反应&#xff0c;本文用于解决部署linux问题。 整合springboot 1、引入pom文件 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess…

linux文件系统 - 初始化(三)

https://www.cnblogs.com/alantu2018/p/8447309.html 执行init程序 一、目的 内核加载完initrd文件后&#xff0c;为挂载磁盘文件系统做好了必要的准备工作&#xff0c;包括挂载了sysfs、proc文件系统&#xff0c;加载了磁盘驱动程序驱动程序等。接下来&#xff0c;内核跳转…

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…

如果查看iPhone的GPU

摘要 了解你的显卡对于在电脑上玩现代图形要求高的游戏非常重要。本文介绍了如何轻松查看你的显卡型号以及为什么显卡在玩电脑游戏时如此关键。 引言 随着电脑游戏的发展&#xff0c;现代游戏对硬件性能的要求越来越高。十年前发布的显卡已经无法满足当前游戏的需求。因此&…

什么叫特征分解?

特征分解&#xff08;Eigenvalue Decomposition&#xff09;是将一个方阵分解为特征向量和特征值的过程。对于一个 nn 的方阵A&#xff0c;其特征向量&#xff08;Eigenvector&#xff09;v 和特征值&#xff08;Eigenvalue&#xff09; λ 满足以下关系&#xff1a; 这可以写…

【Linux】:线程池(逐行解析代码)

线程池 一.概念二.模拟实现一个线程池 一.概念 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅…

博捷芯划片机在半导体芯片切割领域的领先实力

在当今高速发展的半导体行业中&#xff0c;芯片切割作为制造过程中的核心技术环节&#xff0c;对设备的性能和精度要求日益提升。在这方面&#xff0c;国内知名划片机企业博捷芯凭借其卓越的技术实力和持续的创新精神&#xff0c;成功研发出具备完全自主知识产权的半导体切割划…

MySQL 8.3 发布,具体有哪些新增和删减?

MySQL 8.3 主要更新&#xff1a;用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。 MySQL 是一款广泛使用的开源的关系型数据库管理系统&#xff0c;已推出其最新版本 MySQL 8.3。它带来了新功能和一些删除&#xff0c;有望简化数据库操作。让我们来看看有哪些…

基本的 Socket 模型

什么是Socket Socket 的中文名叫作插口&#xff0c;咋一看还挺迷惑的。事实上&#xff0c;双方要进行网络通信前&#xff0c;各自得创建一个 Socket&#xff0c;这相当于客户端和服务器都开了一个“口子”&#xff0c;双方读取和发送数据的时候&#xff0c;都通过这个“口子”…

用通俗易懂的方式讲解:太棒了!构建大模型 Advanced RAG(检索增强生成)的速查表和实战技巧最全总结来了!

新的一年开始了&#xff0c;也许您正打算通过构建自己的第一个RAG系统进入RAG领域。或者&#xff0c;您可能已经构建了基本的RAG系统&#xff0c;现在希望将它们改进为更高级的系统&#xff0c;以更好地处理用户的查询和数据结构。 无论哪种情况&#xff0c;了解从何处或如何开…