iOS的应用生命周期以及应用界面
在iOS的原生开发中,我们需要特别关注两个东西:AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示:
AppDelegate是应用程序委托对象,它继承了UIResponder类,并实现了UIApplicationDelegate委托协议。UIResponder类可以使子类AppDelegate具有处理响应事件的能力,而UIApplicationDelegate委托协议使AppDelegate能够成为应用程序委托对象,这种对象能够响应应用程序的生命周期,该类中继承的一系列方法在应用生命周期的不同阶段会被回调。相应的,AppDelegate的子类也可以实现这两个功能。
ViewController类继承自UIViewController类,它是视图控制器类,在工程中扮演者根视图和用户事件控制类的角色。
应用程序生命周期
作为应用程序的委托对象,AppDelegate类在应用程序生命周期的不同阶段会回调不同的方法。首先,让我们先了解iOS应用的不同状态及其彼此间的关系。

- Not running(非运行状态)。应用没有运行或被系统终止。
- Inactive(前台非活动状态)。应用正在进入前台状态,但是还不能接受事件处理。
- Active(前台活动状态)。应用进入前台状态,能接受事件处理。
- Background(后台状态)。应用进入后台后,依然能够执行代码。如果有可执行的代码,就会执行代码,如果没有可执行的代码或者将可执行的代码执行完毕,应用会马上进入挂起状态。
- Suspended(挂起状态)。被挂起的应用进入一种“冷冻”状态,不能执行代码。如果系统内存不够,应用会被终止。
在应用状态跃迁的过程中,iOS系统会回调AppDelegate中的一些方法,并且发送一些通知。实际上,在应用的生命周期中用到的方法和通知很多,我们选取几个主要的方法和通知进行纤细介绍。

为了让大家更直观地了解各状态与其相应地方法、通知间地关系,下面我们以几个应用场景为切入点进行系统分析。
非运行状态——应用启动场景

点击Home键——应用退出场景




轻按两下Home键可以快速进入iOS(iOS9及其后续版本)多任务栏,此时可以看到处于后台运行或挂起状态地应用,也可能有处于终止状态地应用。向上滑动应用界面,可以删除这些应用并释放内存。
挂起重新运行场景

内存清除:应用终止场景

应用界面
苹果应用程序的界面几乎都是由Cocoa和Cocoa Touch框架中地类和协议等元素构建的,这些元素通过mvc模式有效地组织起来。
macOS应用的界面主要使用Cocoa框架开发,Cocoa是一种为应用程序提供丰富用户体验的框架,其核心是:Foundation和AppKit框架。iOS应用界面主要使用Cocoa Touch框架开发,核心是:foundation和UIKit框架。Cocoa Touch框架有一套自己的MVC模式,其中视图和控制器是UIKit中的UIView(及其子类)和UIViewController(及其子类)。
视图的生命周期
在应用运行过程中视图会显示不同的状态,这就是视图的生命周期。视图生命周期的不同阶段会回调视图控制器的不同方法。

视图创建并加载到内存中时,会调用viewDidLoad方法,这时视图并未出现。该方法中通常会对所控制的视图进行初始化处理。
视图可见前后会调用:viewWillAppear和viewDidAppear方法,视图不可见前后会调用viewWillDisappear和viewDidDisappear方法。这4个方法调用父类相应的方法以实现其功能,编码时调用父类方法的位置可根据实际情况做调整。
viewDidLoad方法在应用运行的时候只调用一次,二上述4个方法可以被反复调用多次。
视图
在Cocoa Touch框架中,提供了视图的“根”类——UIView。
从继承关系上看,UIView是所有视图的“根”。

其中,比较特殊的类是UIControl类,该类是控制类,它及其子类都能响应一些高级事件(可以通过xcode中的sent events栏来查看控件是否有高级事件)。,除此之外的类都无法响应高级事件。事实上,视图也可以响应事件,但是这些事件比较低级,需要开发人员自己处理。很多手势的开发都以这些低级事件为基础。
-
视图分类
- 控件。继承UIControl类,能够响应用户高级事件。
- 窗口。UIWindow对象。一个iOS应用只有一个UIWindow对象(这点和Android就有很大的区别了,Android是一个activity就持有一个window对象,换句话说一个Android应用是有多个window对象的),它是所有子视图的“根”容器(这点就和Android一致)。
- 容器视图。包括UIScrollView、UIToolbar及它们的子类。
- 显示视图。UIImageView、UILabel等。
- 文本和web视图。
- 导航视图。为用户提供从一个屏幕到另一个屏幕的导航(或跳转)视图,包括UITabBar和UINavigationBar。
- 警告框和操作表。用于给用户提供一种反馈或者与用户进行交互。
-
应用界面构建层次
iOS应用界面是由若干个视图构建而成的,这些视图对象采用树形构建。下图是一个应用界面的构建层次图,该应用有一个UIWindow,其中包含一个UIView根视图。根视图下又有3个子视图——Button1、Label2和UIView(View2),其中子视图UIView(View2)中存在一个按钮Button3。
一般情况下,应用中只包含一个UIWindow。从UI构建层次上讲,UIWindow包含一个根视图UIView。根视图一般也只有一个,放于UIWindow中。根视图的类型决定了应用程序的类型。

应用界面的构建层次是一种树形结构,“树根”是Window,RootView根视图是“树干”,其他视图对象为“树冠”。在层次结构中,上下两个视图是“父子关系”。除了Window,每个视图的父视图有且只有一个,子视图可以有多个。它们间的关系涉及3个属性。 -
superview。获得父视图对象。
-
subviews。获得子视图对象集合。
-
window。获得视图所在的界面Window对象。

相关文章:
iOS的应用生命周期以及应用界面
在iOS的原生开发中,我们需要特别关注两个东西:AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示: AppDelegate是应用程序委托对象,它继承了UIResponder类…...
Macos下安装使用Redis
Redis 是一个基于内存的key-value的结构数据库适合存储热点数据 Macos安装Redis https://redis.io/docs/getting-started/installation/install-redis-on-mac-os/安装redis brew install redis查看安装信息: brew info redis前台启动redis: redis-server后台启…...
Redis的四种部署方案
这篇文章介绍Reids最为常见的四种部署模式,其实Reids和数据库的集群模式差不多,可以分为 Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署,其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境…...
Microsoft Edge不能工作了,可能原因不少,那么如何修复呢
Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…...
算法---缺失的第一个正数
题目 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1:输入:nums [1,2,0] 输出:3 示例 2:输入:nums …...
【算法与数据结构】--算法应用--算法和数据结构的案例研究
一、项目管理中的算法应用 在项目管理中,算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究,展示了算法在项目管理中的实际应用: 项目进度管理: 甘特图算法:甘特图是一种项目进度管理…...
java如何获取调用接口的ip?
获取调用者的ip 场景:想知道哪个ip访问的某个接口时,就需要打印出来看看,这时就可以使用这个方法了。 案例: //HttpServletRequest 入参加上,请求对象public ForkResponse queryXXX(RequestBody XXXX xxxx, HttpServletRequest …...
ubuntu 18 更新git版本到 2.80.1
前言 使用gitlab的时候,发现下面这条语句不能用 git init --initial-branch XXX查看git version git version下载 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.38.1.tar.gz 或者 https://git-scm.com/download/linux 或者去github上面下载…...
测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)
参考文献1除了介绍Aplayer组件的用法之外,还提供有demo下载以供学习,本文学习并记录其中的使用方式。 VideoPlayer项目使用C#在VS2013开发,其解决方案中包括VideoPlayer和VideoPlayer两个小项目,前者基于.net framework4.0&am…...
YOLOv5 分类模型的预处理
YOLOv5 分类模型的预处理 flyfish 版本 6.2 将整个代码简化成如下代码 imgsz224 file "/home/a/Pictures/1.jpg" transforms classify_transforms(imgsz) im cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB) print(im.shape)im transforms(im) print(im.…...
25 行为型模式-备忘录模式
1 备忘录模式介绍 备忘录模式(memento pattern)定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 2 备忘录模式原理 3 备忘录模式实现 /*** 发起人角色**/ public class Originator {private Strin…...
物联网AI MicroPython传感器学习 之 SHT3X温湿度传感器
学物联网,来万物简单IoT物联网!! 一、产品简介 Sensirion SHT3x-DIS湿度和温度传感器基于CMOSens传感器芯片,更加智能、可靠,精度更高。SHT3x-DIS具有增强的信号处理能力、两个独特的用户可选I2C地址,通信…...
int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?
int main() {int *p new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i 0; i < 5; i) {p[i] i * 10;}// 试图使用 delete p; 来释放数组内存delete p;delete[] p;// 打印数组元素for (int i 0; i < 5; i) {std::cout << "p[" &l…...
数据结构|基础知识定义
1.值传递、地址传递、值返回、地址返回 1> 值传递:普通变量作为函数参数传递是单向的值传递,只是将实参的值复制一份给形参变量,形参的改变不会影响实参的值,因为所在内存空间不同 如果传递的是地址,被调函数使用指…...
物联网AI MicroPython传感器学习 之 MFRC522 RFID射频IC卡感应模块
学物联网,来万物简单IoT物联网!! 一、产品简介 MFRC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,其特点低电压、低成本、体积小的非接触式读写芯片。MFRC522支持MIFARE系列更高速的非接触式通信,双向数据…...
搭建ES集群
目录 前言 搭建ES集群 集群状态监控 分片备份 节点角色 脑裂问题 分布式存储 分布式查询 故障转移 前言 单机的ES做数据存储必然会面临两个问题:海量数据存储问题、单机故障问题 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&…...
Tomcat的日志接收文件catalina.out nohup.out说明
catalina.out用于接收如下情况的日志: catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的,如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用System.out打印的东西都会到这…...
手机ip地址切换后有什么影响
随着互联网的普及和人们对网络连接的需求不断增加,手机已经成为我们日常生活中不可或缺的一部分。而在使用手机的过程中,手机ip地址的切换也成为了许多用户需要注意的问题。虎观代理小二二将探讨手机ip地址切换后可能产生的影响。 手机ip地址的含义及作…...
C++ 赋值运算重载,const成员,取地址及const取地址操作符重载
C 赋值运算重载,const成员,取地址及const取地址操作符重载 1. 赋值运算符重载1.1 运算符重载1.2 赋值运算符重载1.3 前置/--和后置/--重载 2. const成员3. 取地址及const取地址操作符重载 所属专栏:C“嘎嘎" 系统学习❤️ 🚀…...
嵌入式Linux系统的闪存设备和文件系统学习纪要
嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下: NAND Flash 是一种非易失性存储器(Non-Volatile Memory),常用于闪存设备和固态硬盘(SSD)中。以下是几种常见的 NAND Flash 种类&…...
Spiderbuf_H05时间戳机制深度解析:锚点偏移与服务端校验
1. 这不是“破解”,是时间戳反爬机制的逆向解构你打开浏览器按F12,切到Network面板,刷新页面,盯着XHR请求发呆——那个带一长串数字的timestamp参数,每次刷新都变,但又不是随机乱跳,而是和当前时…...
德国、奥地利和瑞士 SaaS 市场销售策略大揭秘:风险优先,节奏放慢!
1. 嵌入工作流介绍嵌入工作流有其官网主页,具备多种功能,如 ChatGPT 集成、专家支持、无需编码、白标、集成等;还有多种解决方案,包括代理商、CRM、iPaaS 替代方案、物业管理、房地产、初创企业、WordPress 插件、增加收入等&…...
DS4Windows终极指南:5分钟让PS手柄在Windows电脑上完美运行
DS4Windows终极指南:5分钟让PS手柄在Windows电脑上完美运行 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 还在为PS4/PS5手柄在Windows电脑上无法识别而烦恼吗?DS…...
Spring Boot项目里,我是怎么把文心一言API集成进去的(附完整代码)
Spring Boot项目中集成文心一言API的实战指南 最近在开发一个需要AI对话功能的Spring Boot应用时,我选择了百度的文心一言作为后端引擎。整个过程从申请API权限到最终实现流式响应,踩了不少坑也积累了一些经验。本文将分享如何在Spring Boot项目中优雅地…...
从红宝石到光纤:固体激光器家族里,谁才是工业加工界的‘六边形战士’?
从红宝石到光纤:固体激光器家族里,谁才是工业加工界的‘六边形战士’? 在金属切割车间里,激光束正以毫米级精度划过不锈钢板;精密电子产线上,纳米级激光打标机为电路板刻印追溯码;汽车焊接工段…...
保姆级教程:用UE5 Niagara系统10分钟搞定一个逼真的烟雾特效(附材质与帧动画设置)
10分钟用UE5 Niagara打造电影级烟雾特效:从零到实战的极简指南在游戏开发与影视动画领域,烟雾特效一直是营造沉浸感的关键元素。传统粒子系统需要复杂参数调节,而UE5的Niagara系统通过模块化设计,让初学者也能快速实现专业级效果。…...
ImageSearch与Everything集成:如何利用文件搜索神器提升索引速度10倍
ImageSearch与Everything集成:如何利用文件搜索神器提升索引速度10倍 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 想要在本地硬盘…...
RTX51多任务环境下printf安全调用方案解析
1. RTX51多任务环境下printf的安全调用方案在RTX51实时操作系统中,多个任务同时调用标准库函数printf时会出现"多重调用警告"(Warning 15: MULTIPLE CALL TO SEGMENT)。这个看似简单的调试输出问题,实际上涉及RTOS任务调度、函数重入、内存管理…...
天赐范式第53天:当伙伴没有上下文的时候——说我皮肤好~算子包装
我是第一天就开始包装算子用来算CFD的吗,这套技术理论不是多个领域模拟击穿的吗?没发论文就说没发论文,别扯没用的~谁生下来就会叫爸爸呀!伙伴:兄弟,我建议认栽,切回v27 MAC版:bashd…...
如何快速掌握Apache Camel:企业集成模式实战指南
如何快速掌握Apache Camel:企业集成模式实战指南 【免费下载链接】camelinaction2 :camel: This project hosts the source code for the examples of the Camel in Action 2nd ed book :closed_book: written by Claus Ibsen and Jonathan Anstey. 项目地址: htt…...
