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种有的方法并没有打印信息,也就说明没有被调用。

applicationDidBecomeActive

applicationWillResignActive

applicationWillEnterForeground

applicationDidEnterBackground

这几个方法并没有打印信息,不管我如何在前台或者后台。因此,我又在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 UIKit

class 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.orange
        button.setTitle("按钮", for: .normal)
        self.view.addSubview(button)
        button.addTarget(self, action: #selector(click), for: UIControl.Event.touchUpInside)
    }
    @objc func click(){
        button.removeFromSuperview()
    }
    

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从CNN ,LSTM 到Transformer的综述

前情提要:文本大量参照了以下的博客,本文创作的初衷是为了分享博主自己的学习和理解。对于刚开始接触NLP的同学来说,可以结合唐宇迪老师的B站视频【【NLP精华版教程】强推!不愧是的最完整的NLP教程和学习路线图从原理构成开始学&a…

【C++杂货铺】三分钟彻底搞懂函数重载

目录 🌈前言 📁 缺省参数 📂概念 📂分类 📂 注意事项 📁 函数重载 📂概念 📂实现原理 📁 总结 🌈前言 欢迎收看本期【C杂货铺】,这期内容…

[亲测有效]CentOS7下安装mysql5.7

前言 近期项目需要搭配mysql一起存储相关数据,但对mysql的版本有要求,于是在服务器搭建了mysql5.7,顺便记录一下搭建步骤和踩坑解决步骤。 目录 前言 一、清除旧安装包 二、安装YUM 三、使用yum命令即可完成安装 四、重新设置密码 五、…

gradle打包分离依赖jar

正常打包的jar是包含项目所依赖的jar包资源,而且大多数场景下的依赖资源是不会频繁的变更的,所以实际把项目自身jar和其所依赖的资源分离可以实现jar包瘦身,减小上传的jar包总大小,能实现加速部署的效果 一 原本结构 二 配置buil…

基于Python实现人脸识别相似度对比

目录 引言背景介绍目的和意义 人脸识别的原理人脸图像获取人脸检测与定位人脸特征提取相似度计算 基于Python的人脸相似度对比实现数据集准备人脸图像预处理特征提取相似度计算 引言 背景介绍 人脸识别技术是一种通过计算机对人脸图像进行分析和处理,从而实现自动识…

UML中的实现关系

在UML(统一建模语言)中,“实现”关系是指一个类(实现类)实现一个接口或抽象类的方法的情况。这种关系通常用于指定类如何实现某个特定的接口规范。 UML中的实现关系 在UML类图中,实现关系用一条带有空心箭…

学生公寓智能控电管理的功能和管理意义

石家庄光大远通电气有限公司学生公寓智能控电管理系统是由硬件和软件组成的系统,用于控制和管理学生公寓中的电力使用。 一、用户管理 智能控电管理系统具备用户管理功能,可以对学生的个人信息进行统一管理。系统会记录学生的姓名、学号、宿舍号等基本信…

MySQL InnoDB 底层数据存储

InnoDB 页记录Page Directory记录迁移 页 是内存与磁盘交互的基本单位,16kb。 比如,查询的时候,并不是只从磁盘读取某条记录,而是记录所在的页 记录 记录的物理插入是随机的,就是在磁盘上的位置是无序的。但是在页中…

Yuliverse:引领区块链游戏新篇章!

数据源:Yuliverse Dashboard 作者:lesleyfootprint.network 什么是 Yuliverse Yuliverse 是一款元宇宙游戏的先锋,是一款主打 Explore to earn 和 Social to earn 的链游。 这是一款能让你边玩边赚钱的免费区块链游戏,得到 LI…

前端开发如何在自己项目中引用iconfont图标

前端开发如何在自己项目中引用iconfont图标!下面展示一下,详细的引入步骤。 第一步,您需要注册一个会员账号登录进入。创建一个项目。 可以使用其他的平台账号登录,我选了是微信登录,不过他们还会要求你输入手机号&am…

牛客网-----跳石头

题目描述: 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有N块岩石(不含起点和终点的岩石)。在比赛过程中&#xff0…

网络防御保护1

网络防御保护 第一章 网络安全概述 网络安全(Cyber Security)是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断 随着数…

Oracle Linux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!本次安装图解是在一个全新的演示环境下进行的,演示环境中没有任何有价值的数据,但这并不代表摆在你面前的环境也是如此。生产环境…

Linux下软件安装的命令【RPM,YUM】及常用服务安装【JDK,Tomcat,MySQL】

Linux下软件安装的命令 源码安装 以源代码安装软件,每次都需要配置操作系统、配置编译参数、实际编译,最后还要依据个人喜好的方式来安装软件。这个过程很麻烦很累人。 RPM软件包管理 RPM安装软件的默认路径: 注意: /etc 配置文件放置目录…

精益生产咨询背后的秘密:企业如何实现价值最大化

精益生产,起源于丰田生产系统,是一种集中于削减浪费、优化流程、提升顾客价值的生产方法。它的核心在于确保每一步生产过程都能为顾客创造价值。以下是实现精益生产咨询的详细步骤: 1.确定客户价值 一切从顾客需求出发。企业需深入理解顾客…

x-cmd pkg | dasel - JSON、YAML、TOML、XML、CSV 数据的查询和修改工具

目录 简介首次用户快速实验指南基本功能性能特点竞品进一步探索 简介 dasel,是数据(data)和 选择器(selector)的简写,该工具使用选择器查询和修改数据结构。 支持 JSON,YAML,TOML&…

如何正确利用点对点传输工具来传输文件

P2P技术作为一种创新的数据交换机制,近年来已经获得了广泛的关注和应用。这种技术通过直接在用户之间建立连接,绕过了传统的中心服务器架构,从而在数据传输效率和速度上实现了显著提升。然而,正如硬币有两面,P2P技术同…

Leetcode—23.合并 K 个升序链表【困难】

2023每日刷题(八十三) Leetcode—23.合并 K 个升序链表 算法思想 用容量为K的最小堆优先队列,把链表的头结点都放进去,然后出队当前优先队列中最小的,挂上链表,,然后让出队的那个节点的下一个…

Postman基本使用、测试环境(Environment)配置

文章目录 准备测试项目DemoController测试代码Interceptor模拟拦截配置 Postman模块简单介绍Postman通用环境配置新建环境(Environment)配置环境(Environment)设置域名变量引用域名变量查看请求结果打印 Postman脚本设置变量登录成功后设置全局Auth-Token脚本编写脚本查看conso…

C Primer Plus 第6版 编程练习 chapter 17

文章目录 1. 第1题1.1 题目描述1.2 递归方式1.2.1 源码1.2.1 结果显示 1.3 双向链表1.3.1 源码1.3.2 结果显示 2. 第2题2.1 题目描述2.2 编程源码2.3 结果显示 3. 第3题3.1 题目描述3.2 编程源码3.3 结果显示 4. 第4题4.1 题目描述4.2 编程源码4.3 结果显示 5. 第5题5.1 题目描…