iOS视图控制器的生命周期及各阶段的作用
iOS视图控制器(UIViewController)的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机,这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的作用的详细描述:
一、生命周期阶段
-
初始化和创建(Initialization and Creation)
- alloc:当需要一个新的视图控制器实例时,首先通过alloc方法分配内存空间。这是对象生命周期的起点。
- init(或initWithNibName等):紧接着,通过init(或其变体如initWithNibName)方法初始化对象。在这个阶段,可以进行必要的初始化设置,如加载xib文件或配置一些初始数据。
-
加载视图(Loading the View)
- loadView:当视图控制器需要加载其关联的视图时,会调用loadView方法。在iOS 6及以后的版本中,如果使用Storyboard或xib文件来创建视图,通常不需要重写这个方法,因为系统会自动加载视图。但如果打算通过代码手动创建视图,则需要在loadView方法中实现视图的创建和设置。loadView方法只会被调用一次。
-
视图加载完成(View Loaded)
- viewDidLoad:在视图加载完成后,viewDidLoad方法会被调用。这是进行视图初始化设置和添加子视图的最佳时机。在这个阶段,可以配置界面元素、添加子视图、设置数据源和代理等。viewDidLoad方法在视图控制器的生命周期中只会被调用一次。
-
视图即将显示(View Will Appear)
- viewWillAppear:当视图即将显示在屏幕上时,viewWillAppear方法会被调用。这个方法是进行界面更新和准备工作的好地方,如加载数据、注册通知、更新UI等。viewWillAppear方法可以多次被调用,因为视图控制器的视图可以多次被添加到父视图上。
-
视图显示完成(View Did Appear)
- viewDidAppear:当视图已经在屏幕上渲染完成时,viewDidAppear方法会被调用。这是执行与用户交互相关的操作和启动动画的合适时机,如启动定时器、开始动画效果等。同样,由于视图可以被多次添加到父视图上,viewDidAppear方法也可以被多次调用。
-
视图即将消失(View Will Disappear)
- viewWillDisappear:当视图即将从屏幕上移除时,viewWillDisappear方法会被调用。这是保存数据或执行其他清理操作的时机,如取消网络请求、保存用户输入等。viewWillDisappear方法也可以多次被调用。
-
视图消失完成(View Did Disappear)
- viewDidDisappear:当视图已经从屏幕上移除时,viewDidDisappear方法会被调用。这是执行一些资源释放或停止动画等操作的合适时机,如释放内存、停止定时器等。viewDidDisappear方法也可以被多次调用。
-
视图控制器的销毁(Deallocation)
- dealloc:当视图控制器被销毁时,dealloc方法会被调用。这是进行资源清理和内存释放的最后机会。在dealloc方法中,应该释放所有在init和viewDidLoad等方法中创建的资源。在自动引用计数(ARC)环境下,通常不需要手动调用dealloc方法进行资源释放,因为ARC会自动管理内存。但在非ARC环境或需要执行特定清理操作的场景中,仍然可以重写dealloc方法。
二、各阶段作用
- 初始化和创建阶段:为视图控制器分配内存和进行必要的初始化设置。
- 加载视图阶段:创建和设置视图控制器的根视图。
- 视图加载完成阶段:进行视图的初始化设置和子视图的添加,配置界面元素,设置数据源和代理等。
- 视图即将显示阶段:在视图即将显示在屏幕上时,执行一些界面更新和准备工作,如加载数据、注册通知等,以准备视图的显示。
- 视图显示完成阶段:当视图已经在屏幕上渲染完成时,执行与用户交互相关的操作和启动动画,如启动定时器、执行页面跳转后的逻辑处理、启动页面动画等。这个阶段是确保用户体验流畅性的关键时期。
- 视图即将消失阶段:在视图即将从屏幕上移除时,进行数据的保存或执行其他清理操作,如取消网络请求、停止正在进行的动画、保存用户输入等。这是确保数据一致性和应用稳定性的重要环节。
- 视图消失完成阶段:当视图已经从屏幕上移除时,执行资源释放和停止不再需要的操作,如释放内存、停止定时器等。这个阶段有助于减少内存泄漏,提高应用的性能。
- 视图控制器的销毁阶段:在ARC环境下,虽然不需要手动调用dealloc方法进行资源释放,但了解这个阶段的存在仍然很重要。在非ARC环境或需要执行特定清理操作的场景中,dealloc方法提供了最后的机会来释放资源。
综上所述,深入理解并合理利用iOS视图控制器的生命周期,是开发高质量iOS应用的基石之一。通过合理组织代码、优化性能、管理资源和提升用户体验,可以创建出更加稳定、高效、用户友好的应用。
相关文章:
iOS视图控制器的生命周期及各阶段的作用
iOS视图控制器(UIViewController)的生命周期是指从它被创建到最终被销毁的过程中所经历的一系列阶段。每个阶段都有其特定的作用和执行时机,这些阶段和作用对于开发高效、稳定的iOS应用至关重要。以下是iOS视图控制器的生命周期及其各个阶段的…...
四轮阿克曼(前轮转向、后轮驱动)车子仿真控制
目录 写在前面的话调用 libgazebo_ros_ackermann_drive.so 插件属性介绍补充 steering_wheel_joint 配置键盘控制命令 结果演示 写在前面的话 这里增加一个四轮阿克曼(前轮转向、后轮驱动)车子仿真控制的版本,使用的事gazebo的插件 参考资料…...
Blender均匀放缩模型
解决办法: 首先选中模型,按下“s”键,如下图所示,此时模型根据鼠标的移动放缩 或者在按下“s”后输入数值,再按回车键Enter,模型会根据你该数值进行均匀放缩 指定放大2倍结果——...
Python基于 Opencv+wxPython 的人脸识别上课考勤系统,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【AI工具】强大的AI编辑器Cursor详细使用教程
目录 一、下载安装与注册 二、内置模型与配置 三、常用快捷键 四、项目开发与问答 五、注意事项与技巧 参考资料 近日,由四名麻省理工学院(MIT)本科生共同创立的Anysphere公司宣布,其开发的AI代码编辑器Cursor在成立短短两年…...
DApp开发与APP开发的五大区别
随着比特币与区块链技术的不断发展,DApp应用会逐渐成为主流。与APPAPP相比,DApp有许多不同之处,尤其是在架构、数据存储、用户隐私等方面。本文将通过五大关键点,深入探讨DApp开发与APP开发之间的主要区别。 1. 后端架构ÿ…...
哪款云手机适合多开?常用云手机功能对比
在全球化和数字化时代,云手机以其独特的灵活性和高效性,成为多账号运营和数字营销的热门工具。云手机能够解决传统设备管理的诸多痛点,例如账号关联、硬件成本高等问题。本文将为您推荐多款优质云手机品牌,帮助您选择最适合的工具…...
Python几种常用数据结构(重制版)
一、列表 [List] 定义:有序可重复的数据集合。示例:my_list [element1, element2, element3]增加元素方法: append():在列表末尾增加单个元素(列表特有方法),例如 my_list.append(element)。e…...
C++ 游戏开发:开启游戏世界的编程之旅(2)
三、游戏输入处理 (一)键盘输入处理 在游戏中,玩家通过键盘输入来控制角色的行动。我们需要在游戏循环中不断检测键盘事件,并根据不同的按键按下或松开状态来执行相应的操作。例如,在 SDL 中,可以这样处理…...
用 Python 做数据分析需要掌握哪些基础?
用 Python 做数据分析,需要掌握以下几个基础方面: 1. Python 编程基础 语法基础:变量、数据类型(如字符串、整数、浮点数、布尔值)、条件语句(if-else)、循环(for、while࿰…...
UE5 像素流进行内网https证书创建
确定证书需求 内网 HTTPS 通信通常需要以下内容: 自签名证书(适用于内网环境,不需要通过公开的证书颁发机构 CA) 或者通过内部的企业 CA 签发的证书(更安全)。 生成自签名证书 使用工具(如 Ope…...
Envoy-istio
最近研究envoy-istio,发现这个博客,觉得很不错,这里记录一下 envoy-istio介绍 envoy-istio - 随笔分类 - yaowx - 博客园 envoy部分七:envoy的http流量管理基础 envoy部分六:envoy的集群管理 envoy部分五ÿ…...
CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)
附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8,支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图,确保页面在不同设备上自适应显示 --&…...
【数据结构与算法】排序算法(上)——插入排序与选择排序
文章目录 一、常见的排序算法二、插入排序2.1、直接插入排序2.2、希尔排序( 缩小增量排序 ) 三、选择排序3.1、直接选择排序3.2、堆排序3.2.1、堆排序的代码实现 一、常见的排序算法 常见排序算法中有四大排序算法,第一是插入排序,二是选择排序ÿ…...
Linux操作系统性能优化
Linux操作系统性能优化 1. TCP连接出现大量ESTABLISHED连接解决方法 1. TCP连接出现大量ESTABLISHED连接解决方法 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于…...
iOS与Windows间传文件
想用数据线从 windows 手提电脑传文件入 iPhone,有点迂回。 参考 [1],要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机,界面: 点左侧栏「文件」,不是就直接可以传,而是要通过某个应用传…...
在数据库设计中同步冗余字段的思考与实践
目录 前言1. 冗余字段设计的背景与场景1.1 场景描述1.2 冗余字段的必要性 2. 冗余字段设计的优点2.1 提高查询效率2.2 简化应用逻辑 3. 冗余字段设计的缺点与挑战3.1 数据不一致问题3.2 更新开销增加3.3 数据冗余占用存储空间 4. 如何同步更新冗余字段4.1 手动更新方式4.2 使用…...
Qt 带数据库功能的项目部署之后,数据库无法打开问题解决方法
前言:最近项目添加了sqlite数据库功能,在qtcreator直接运行时,打开数据库正常,但是部署之后,发现数据库打开会失败,提示“driver not loaded”错误,后来发现是因为sqldrivers文件夹目录不对导致…...
汇编语言学习-二
好吧,已经隔了两天,下完班看了两天,在电脑上装了虚拟机版的MS_DOS,主要是怕折腾坏我的电脑系统; 这个第二天应该是称为第二章更为合适,目前第二章已经看完,基本的命令也是敲了敲; 下面就进行一…...
【嘟嘟早教卡】 小程序源码分享带后台管理
【嘟嘟早教卡】是专门为 3-6 岁婴幼儿童学习普通话、英语研发的早教启蒙认知识字的小程序 小程序由 Taro 及 Tailwind CSS 构建而成,后台管理使用 Laravel 及 Tailwind CSS 想法源于小时候玩的认知卡片,基本大部分家庭都买过认知卡片,我按照…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
