ViewController 生命周期

news2024/10/7 13:20:11

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 文件夹。

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

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

相关文章

kafka中

Kafka RocketMQ概述 RabbitMQ概述 ActiveMQ概述 ZeroMQ概述 MQ对比选型 适用场景-从公司基础建设力量角度出发 适用场景-从业务场景出发 Kafka配置介绍 运行Kafka 安装ELAK 配置EFAK EFAK界面 KAFKA常用术语 Kafka常用指令 Kafka中消息读取 单播消息 group.id 相同 多播消息 g…

LabVIEW在图像处理中的应用

abVIEW作为一种图形化编程环境,不仅在数据采集和仪器控制领域表现出色,还在图像处理方面具有强大的功能。借助其Vision Development Module,LabVIEW提供了丰富的图像处理工具,广泛应用于工业检测、医学影像、自动化控制等多个领域…

LabVIEW在自动化测试项目中的推荐架构

在自动化测试项目中,推荐使用LabVIEW的生产者-消费者(Producer-Consumer)架构。这种架构利用队列实现数据的异步传输和处理,提供了高效、稳定和可扩展的解决方案。其主要优点包括:实现数据采集与处理的解耦、提高系统响…

SKF轴承故障频率查询

1,第一步:搜索轴承型号 skf官网 2,第二步:查询故障频率。 第三步:

《基于 defineProperty 实现前端运行时变量检测》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,欢迎多多交流~ &am…

SpringBoot实现多数据源切换

1. 概述 仓库地址:https://gitee.com/aopmin/multi-datasource-demo 随着项目规模的扩大和业务需求的复杂化,单一数据源已经不能满足实际开发中的需求。在许多情况下,我们需要同时操作多个数据库,或者需要将不同类型的数据存储在不…

MyBatis-Plus-实用的功能自动填充字段

前言: java项目用到了mybatis-plus,在一些类里面需要在更新时候,统一设置,修改人,修改ID,修改时间。新增时候设置 创建人,创建时间等 基础类: Data public abstract class BaseModel implements…

昇思25天学习打卡营第18天 | K近邻算法实现红酒聚类

1、实验目的 了解KNN的基本概念;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,最初由 Cover和Hart于1968年提出(Cover等人,1967)&#…

身体(body)的觉醒

佛,是一个梵文的汉语音译词,指觉醒者。 何谓觉醒?什么的觉醒?其实很简单,就是身体的觉醒。 佛的另一个名字,叫菩提,佛就是菩提,菩提老祖,就是佛祖。 body,即…

如何优化 PostgreSQL 中对于复杂数学计算的查询?

文章目录 一、理解复杂数学计算的特点二、优化原则(一)索引优化(二)查询重写(三)数据库配置调整(四)使用数据库内置函数的优势 三、具体的优化方案和示例(一)…

数据结构算法-排序(一)-冒泡排序

什么是冒泡排序 冒泡排序:在原数组中通过相邻两项元素的比较,交换而完成的排序算法。 算法核心 数组中相邻两项比较、交换。 算法复杂度 时间复杂度 实现一次排序找到最大值需要遍历 n-1次(n为数组长度) 需要这样的排序 n-1次。 需要 (n-1) * (n-1) —…

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

几款电脑端能够运行的AI大模型聊天客户端

Ollama Ollama 是一个用于在本地运行和管理大型语言模型的工具。它支持多种流行模型的下载和本地运行,包括 LLaMA-2、CodeLLaMA、Falcon 和 Mistral 。Ollama 提供了一个简单、轻量级和可扩展的解决方案,使得用户可以以最简单快速的方式在本地运行大模型…

LabVIEW透视变换

透视变换概述源程序在www.bjcyck.com下载 透视变换是一种几何变换,用于对图像进行扭曲,使其看起来从不同角度拍摄。这在计算机视觉和图像处理领域非常重要,例如在投影校正和图像配准中。LabVIEW提供了强大的图像处理工具,利用其V…

阿里通义音频生成大模型 FunAudioLLM 开源!

01 导读 人类对自身的研究和模仿由来已久,在我国2000多年前的《列子汤问》里就描述了有能工巧匠制作出会说话会舞动的类人机器人的故事。声音包含丰富的个体特征及情感情绪信息,对话作为人类最常使用亲切自然的交互模式,是连接人与智能世界…

gcc的编译C语言的过程

gcc的简介 GCC(GNU Compiler Collection)是由GNU项目开发和维护的一套开源编程语言编译器集合。它支持多种编程语言,包括但不限于C、C、Objective-C、Fortran、Ada等。GCC被广泛应用于编译和优化各种程序,是许多开发者和组织的首选…

【Unity数据交互】如何Unity中读取Ecxel中的数据

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧&…

picgo+gitee图床配置

node.js安装 刚开始顺着picgo操作,直接跳转到了node.js官网 下载的时候直接 Next,然后可以自定义安装路径,我的安装路径是C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js 然后再在安装路径的根目录下新建两个文件夹,nodecache 和 nodeglobal, 如图所示:…

ida动态调试-cnblog

ida动态调试 传递启动ida服务 android_server在ida\dbgsrv目录中 adb push android_server /data/local/tmp/chmod 755 /data/local/tmp/android_server /data/local/tmp/android_serveradb forward tcp:23946 tcp:23946ida报错:大多是手机端口被占用 报错提示: …

GD32 MCU ADC采样率如何计算?

大家在使用ADC采样的时候是否计算过ADC的采样率,这个问题非常关键! 以下为GD32F303系列MCU中有关ADC的参数,其中ADC时钟最大值为40MHz,12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话,可能会造成ADC采样异常&…