ViewController 生命周期

ViewController 生命周期

  • ViewController 生命周期
    • 测试程序:ViewControllerLifeCircle

ViewController 生命周期

ViewController 是 iOS 开发中 MVC 框架中的 C,ViewColllecter 是 View(视图)的 Collecter(控制器)。ViewController 的职责主要包括管理内部各个 View 的加载显示和卸载,同时负责与其他 ViewController 的通信和协调。

iOS 中的 ViewController 分为两种:

  1. 显示视图的控制器。比如:UIViewController、UITableViewController等,同时还可以自定义继承自UIViewController的ViewController。

  2. 控制和管理视图,比如:

    • UINavigationController:是 iOS 开发中的一个视图控制器容器,用于以栈(stack)的形式存储和管理其他视图控制器。通过它可以方便地实现应用程序的导航结构,比如在层级间进行导航、显示导航栏、处理返回操作等。这使得用户能够直观地浏览和切换不同的界面。
    • UITabBarController:是 iOS 开发中的一个视图控制器容器,用于以标签页(tab)的形式存储和管理其他视图控制器。每个标签页代表一个视图控制器,用户可以通过点击不同的标签页来切换显示不同的视图控制器。UITabBarController 提供了一种方便的方式来组织和切换多个视图控制器,使用户可以快速访问不同的功能模块或视图。它常用于应用程序的主界面,如底部导航栏等。通过 UITabBarController,可以轻松实现多个视图控制器的切换和导航。

ViewController 生命周期会经历初始化、加载视图、销毁视图、生命结束等过程,流程执行如下图所示:

img

ViewController 生命周期中涉及的各种方法:

  1. init:初始化 ViewController 对象。
  2. loadView:在 UIViewController 对象的 view 被访问且为 nil 的时候调用。控制器 view 是通过懒加载的方式进行加载的,即用到的时候再加载。在 view 加载过程中首先会调用 loadView 方法,在这个方法中主要完成一些关键 view 的初始化工作,接下来就是加载 view,加载成功后,会接着调用 viewDidLoad 方法。在 loadView 之前,是没有 view 的,也就是说,在这之前,view 还没有被初始化。
  3. viewDidLoad:视图加载完成后调用。通常,对于各种初始化数据的载入,初始设定、修改约束、移除视图等很多操作都可以这个方法中实现。通常在此方法中添加一些控件和视图。注意这个方法在视图销毁之前只会调用一次。
  4. (void)viewWillAppear:(BOOL)animated {}:视图即将加入窗口时调用。在 viewDidLoad 将视图载入内存后,将会在屏幕上显示视图,这时会先调用这个方法。通常会在这个方法对即将显示的视图做进一步的设置。比如,设置设备不同方向时该如何显示、设置状态栏方向、设置视图显示样式等。
  5. (void)viewDidAppear:(BOOL)animated {}:视图已经加入到窗口时调用。这时可以对正在显示的视图做设置。
  6. (void)viewWillDisappear:(BOOL)animated {}:视图即将消失、被覆盖或是隐藏时调用。
  7. (void)viewDidDisappear:(BOOL)animated {}:视图已经消失、被覆盖或是隐藏时调用。
  8. viewDidUnload:系统内存不足时调用。内存吃紧时,在 iPhone OS 3.0 之前 didReceiveMemoryWarning 是释放无用内存的唯一方式,现在 viewDidUnload 方法是更好的方式。在该方法中将所有 IBOutlet 置为 nil,释放其他与 view 有关的对象、其他在运行时创建(但非系统必须)的对象、在 viewDidLoad 中被创建的对象、缓存数据等。
  9. dealloc:视图被销毁时调用。释放在 init 和 viewDidLoad 中创建的对象。

测试程序:ViewControllerLifeCircle

编写了一个 iOS 程序,实现了 2 个 ViewController,分别叫:AViewController、BViewController。重写了 2 个 ViewController 的各个生命周期的方法,让程序在对应页面的生命周期内打印当前执行的方法。在 AViewController 实现了一个按钮的点击事件,可以跳转到 BViewController,在 BViewController 也实现了一个按钮的点击事件,可以返回上个页面。

运行程序,在页面 A 点击按钮,跳转至 B,再点击 B 的按钮,返回 A。程序打印信息如下所示:

2024-06-27 18:50:37.563612+0800 ViewControllerLifeCircle[5412:1975949] AViewController: loadView
2024-06-27 18:50:37.564140+0800 ViewControllerLifeCircle[5412:1975949] AViewController: viewDidLoad
2024-06-27 18:50:37.564355+0800 ViewControllerLifeCircle[5412:1975949] AViewController: viewWillAppear
2024-06-27 18:50:37.624014+0800 ViewControllerLifeCircle[5412:1975949] AViewController: viewDidAppear
2024-06-27 18:50:44.922836+0800 ViewControllerLifeCircle[5412:1975949] A->B
2024-06-27 18:50:44.924060+0800 ViewControllerLifeCircle[5412:1975949] BViewController: loadView
2024-06-27 18:50:44.927415+0800 ViewControllerLifeCircle[5412:1975949] BViewController: viewDidLoad
2024-06-27 18:50:44.936887+0800 ViewControllerLifeCircle[5412:1975949] AViewController: viewWillDisappear
2024-06-27 18:50:44.937354+0800 ViewControllerLifeCircle[5412:1975949] BViewController: viewWillAppear
2024-06-27 18:50:44.947878+0800 ViewControllerLifeCircle[5412:1975949] BViewController: viewDidAppear
2024-06-27 18:50:44.948073+0800 ViewControllerLifeCircle[5412:1975949] AViewController: viewDidDisappear
2024-06-27 18:51:09.697424+0800 ViewControllerLifeCircle[5412:1975949] B->A
2024-06-27 18:51:09.704704+0800 ViewControllerLifeCircle[5412:1975949] BViewController: viewWillDisappear
2024-06-27 18:51:09.705139+0800 ViewControllerLifeCircle[5412:1975949] AViewController: viewWillAppear
2024-06-27 18:51:09.720304+0800 ViewControllerLifeCircle[5412:1975949] AViewController: viewDidAppear
2024-06-27 18:51:09.720551+0800 ViewControllerLifeCircle[5412:1975949] BViewController: viewDidDisappear

程序首先显示的是页面 A,所以走完了 AViewController 从加载到显示的生命周期。

从 A 跳转到 B,因为是第一次打开页面 B,所以要先执行 BViewController 的 loadView 方法,将界面 B 加载到内存后,后面的顺序是:AViewController: viewWillDisappear => BViewController: viewWillAppear => BViewController: viewDidAppear => AViewController: viewDidDisappear。

之后,从 B 返回 A,顺序也是按照:b.willDisappear => a.willAppear => a.didAppear => b.didDisappear。

程序源码位于 https://github.com/UestcXiye/Objective-C-Practice 的 ViewControllerLifeCircle 文件夹。

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

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

相关文章

Vim编辑器与Shell命令脚本

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、Vim文本编辑器 二、编写Shell脚本 三、流程控制语句 四、计划任务服务程序 致谢 一、Vim文本编辑器 “在Linux系统中一切都是文件&am…

TQ15EG开发板教程:MPSOC创建fmcomms8工程

链接:https://pan.baidu.com/s/1jbuYs9alP2SaqnV5fpNgyg 提取码:r00c 本例程需要实现在hdl加no-OS系统中,通过修改fmcomms8/zcu102项目,实现在MPSOC两个fmc口上运行fmcomms8项目。 目录 1 下载文件与切换版本 2 编译fmcomms8项…

【SpringCloud】概述 -- 微服务入门

在Java的整个学习过程中,大家势必会听见一些什么分布式-微服务、高并发、高可用这些专业术语,给人的感觉很高级,有一种高深莫测的感觉。可以看一下这篇博客对这些技术架构的演变有一个初步的认识: 服务端⾼并发分布式结构演进之路-CSDN博客文…

Java开源ERP系统Axelor汉化方法初探

Axelor简介 汉化过程介绍 定义语言和本地化 导出多语言记录 导入翻译 验证翻译 调整翻译 Axelor简介 2024年6月份Axelor ERP发布了8.1版本,适配JDK11及PostgreSQL12及以上版本(7及以前版本适配JDK8及PostgreSQL10)数据库。v8版本较之前…

kubernetes集群部署:node节点部署和cri-docker运行时安装(四)

安装前准备 同《kubernetes集群部署:环境准备及master节点部署(二)》 安装cri-docker 在 Kubernetes 1.20 版本之前,Docker 是 Kubernetes 默认的容器运行时。然而,Kubernetes 社区决定在 Kubernetes 1.20 及以后的…

昇思MindSpore学习入门-评价指标

当训练任务结束,常常需要评价函数(Metrics)来评估模型的好坏。不同的训练任务往往需要不同的Metrics函数。例如,对于二分类问题,常用的评价指标有precision(准确率)、recall(召回率&…

代码随想录算法训练Day58|LeetCode417-太平洋大西洋水流问题、LeetCode827-最大人工岛

太平洋大西洋水流问题 力扣417-太平洋大西洋水流问题 有一个 m n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个…

调度系统揭秘(下):调度算法与架构设计

文章目录 一、调度算法1.1、广度优先:1.2、深度优先1.3、总结广度优先搜索(BFS)深度优先搜索(DFS) 二、架构设计2.1、Master/Slave架构优劣分析 2.2、Leader架构优劣分析 2.3、总结 一、调度算法 在调度系统中,调度算…

【】AI八股-神经网络相关

Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结: 小菜鸡写一写基础深度学习的问题(复制大佬的,自己复习用) - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …

本安防爆手机:危险环境下的安全通信解决方案

在石油化工、煤矿、天然气等危险环境中,通信安全是保障工作人员生命安全和生产顺利进行的关键。防爆智能手机作为专为这些环境设计的通信工具,提供了全方位的安全通信解决方案。 防爆设计与材料: 防爆智能手机采用特殊的防爆结构和材料&…

机械硬盘故障分析及损坏处理(坏道屏蔽)

机械硬盘故障分析: 1、加电后没有声音就是电机不转,是电路问题,更换电路板解决。 2、加电后电机转,有连续敲击声音,或有异响,磁头损坏或机械故障。 3、加电后电机转,运行正常,BIOS无…

建立数据通路(一)

指令周期(Instruction Cycle) 指令种类 Fetch(取得指令) 也就是从PC寄存器里找到对应的指令地址,根据指令地址从内存里把具体的指令,加载到指令寄存器中然后把PC寄存器自增,好在未来执行下一条指令 Decode(指令译码) 也就是根据指令寄存器里…

Apache Seata新特性支持 -- undo_log压缩

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata新特性支持 – undo_log压缩 Seata新特性支持 – undo_log压缩 现状 & 痛点…

类与对像(1)

好几个月没有写了,差了好多,这些天补回来吧。 接下来,让我们正式步入C与C语言开始不同的地方。 我对类的理解:类是对于具有相同或相似属性的数据集合。 类的关键词:class,public,protected&a…

2024年加密货币市场展望:L1、L2、LSD、Web3 和 GameFi 板块的全面分析与预测

随着区块链技术的快速发展,加密货币市场在2024年继续展现出蓬勃的生机和创新的潜力。本文将深入分析L1、L2、LSD、Web3和GameFi这五大板块的发展趋势和预测,帮助投资者和爱好者更好地理解和把握市场机遇。 一、L1:基础层协议的持续进化 L1&a…

python自动化办公之cryptography加密解密

目录 用到的库 实现效果 代码部分 1、加密2024.txt文件 2、解密2024.txt文件 用到的库 cryptography 实现效果 加密文件和解密文件 代码部分 1、加密2024.txt文件 # 加密 from cryptography.fernet import Fernet # 生成加密密钥 keyFernet.generate_key() cipher_s…

K8S 部署 EFK

安装说明 系统版本为 Centos7.9 内核版本为 6.3.5-1.el7 K8S版本为 v1.26.14 ES官网 开始安装 本次安装使用官方ECK方式部署 EFK,部署的是当前的最新版本。 在 Kubernetes 集群中部署 ECK 安装自定义资源 如果能打开这个网址的话直接用这个命令安装,打不开的话…

创建一个不带框架的javaweb工程

点击新建 选择Maven,然后在Archetype里面选择 webapp选项(注意这里需要配置好Maven的环境 如果没配好Maven引入依赖的时候会引不进来) 如果Maven配置之后就会显示配置成功 然后我们要配置tomacat的依赖 jde选择默认 然后点击部署 选择工件&a…

高阶算法班从入门到精通之路课程

本课程旨在帮助学员深入理解算法与数据结构的核心概念,从而掌握高级算法设计与分析技能。每集课程内容精心设计,涵盖了常用数据结构、经典算法及其应用场景等方面的深度讲解,同时通过大量实例演练,帮助学员提升解决实际编程难题的…

2000-2022年地级市数字经济指数(含控制变量)

2000-2022年地级市数字经济指数(含控制变量) 目录 数字经济对区域经济发展的影响实证研究 一、引言 二、文献综述 三、数据来源与变量说明 四、实证模型 五、程序代码与运行结果 数字经济对区域经济发展的影响实证研究 摘要: 本文旨在…