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…

Whatsapp 相关

Whatsapp 相关 本篇文章主要记录下whatsapp 的一些文件信息的存储路径. 1: 应用包名 whatsapp的包名如下: com.whatsapp 2: 注册信息 whatsapp的注册信息存储路径如下: /data/data/com.whatsapp/shared_prefs/registration.RegisterPhone.xml内容如下: <?xml versio…

Android:RecyclerView自由拖动item

原生就自带有可拖动item的工具&#xff1a;ItemTouchHelper 看下效果&#xff1a; 可拖动RecyclerView预览效果 接下来我们看如何使用。 1、自定义ItemTouchHelper的callback&#xff0c;用来限制是否可以拖动&#xff0c;以及拖动之后的位置更新&#xff1a; 其中判断条件中…

python的__doc__

直接问GPT的回答如下&#xff0c;但是提供的例子不够好。 __doc__ 是 Python 中用于保存对象&#xff08;模块、类、函数等&#xff09;文档字符串的特殊属性。 文档字符串&#xff08;docstring&#xff09;是编写在代码中用于文档自述的字符串。它通常用于提供关于代码目的…

python常见函数-笔记

lambda函数用法 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。 所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函数的方法。 lambda函数一…

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

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

k8s之ingress

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

OSPF基础华为ICT网络赛道

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

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

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

【数据结构】从顺序表到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线性表的概念 线性表&#xff08;linear list&#xf…

postgres面试题

《PostgreSQL面试题集锦》学习与回答_pg面试-CSDN博客 postgresql 数据库面试题及知识梳理_51CTO博客的技术博客_51CTO博客 PostgreSQL问答&#xff08;面试&#xff09;- 2211_51CTO博客的技术博客_51CTO博客 PostgreSQL问答&#xff08;面试&#xff09;- 2210_51CTO博客的…

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

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

CTF CRYPTO 密码学-5

题目名称&#xff1a;山岚 题目描述&#xff1a; 山岚 f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} 解题过程&#xff1a; Step1&#xff1a;根据题目提示栅栏加密 分析 观察给出的密文发现有f、l、a、g等字符有规律的夹杂的密文中间&#xff0c;看出都是每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;内核跳转…

Kubernetes中拉取Harbor私有镜像

1、首先&#xff0c;确保已经安装了Docker并配置好了与Harbor的连接。可以使用docker login <harbor地址>命令登录到Harbor仓库。 创建一个Secret对象来存储Harbor的认证信息。可以通过运行以下命令生成该Secret对象&#xff1a; kubectl create secret docker-registry…

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;现代游戏对硬件性能的要求越来越高。十年前发布的显卡已经无法满足当前游戏的需求。因此&…