目录

      • 一、应用生命周期(App Lifecycle)
        • UIKit (AppDelegate)
        • SwiftUI (使用 ScenePhase)
      • 二、页面生命周期(ViewController Lifecycle)
      • 三、视图生命周期(UIView Lifecycle)
      • 四、SwiftUI 视图生命周期
      • 五、关键对比总结

在 Swift 开发中,应用、页面(视图控制器)和视图的生命周期是核心概念。以下是 iOS 开发中(UIKit 和 SwiftUI)的生命周期详解:


一、应用生命周期(App Lifecycle)

通过 AppDelegate 或 SwiftUI 的 App 协议管理应用级事件:

UIKit (AppDelegate)
class AppDelegate: UIResponder, UIApplicationDelegate {// 应用启动完成func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {print("App Launched")return true}// 应用进入前台func applicationDidBecomeActive(_ application: UIApplication) {print("App Active")}// 应用进入后台func applicationDidEnterBackground(_ application: UIApplication) {print("App Background")}// 应用即将终止func applicationWillTerminate(_ application: UIApplication) {print("App Terminated")}
}
SwiftUI (使用 ScenePhase)
@main
struct MyApp: App {@Environment(\.scenePhase) var scenePhasevar body: some Scene {WindowGroup {ContentView()}.onChange(of: scenePhase) { newPhase inswitch newPhase {case .active: print("App Active")case .inactive: print("App Inactive")case .background: print("App Background")@unknown default: break}}}
}

二、页面生命周期(ViewController Lifecycle)

UIKit 的UIViewController生命周期(每个方法都需调用 super):

方法调用时机
init(coder:)/ init(nibName:bundle:)控制器初始化
loadView()创建视图层次结构(不要手动调用)
viewDidLoad()视图加载完成(只调用一次)
viewWillAppear(_:)视图即将显示(每次进入页面时调用)
viewWillLayoutSubviews()视图即将布局子视图
viewDidLayoutSubviews()视图已完成子视图布局
viewDidAppear(_:)视图已显示
viewWillDisappear(_:)视图即将消失
viewDidDisappear(_:)视图已消失
deinit控制器销毁

示例代码:

class ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()print("View Loaded")}override func viewWillAppear(_ animated: Bool) {super.viewWillAppear(animated)print("View Will Appear")}override func viewDidDisappear(_ animated: Bool) {super.viewDidDisappear(animated)print("View Disappeared")}deinit {print("ViewController Deallocated")}
}

三、视图生命周期(UIView Lifecycle)

UIKit 的UIView关键方法

方法调用时机
init(frame:) / init(coder:)视图初始化
didAddSubview(_:)子视图被添加
willRemoveSubview(_:)子视图将被移除
willMove(toSuperview:)即将添加到父视图
didMoveToSuperview()已添加到父视图
layoutSubviews()布局子视图(布局变更时调用)
draw(_:)需要重绘内容(避免手动调用)
removeFromSuperview()从父视图移除
deinit视图销毁

示例代码:

class CustomView: UIView {override func layoutSubviews() {super.layoutSubviews()print("Layout Subviews (e.g., frame changed)")}deinit {print("View Deallocated")}
}

四、SwiftUI 视图生命周期

SwiftUI 使用声明式语法,通过修饰符响应事件:

修饰符作用
.onAppear { }视图出现时调用(类似 viewDidAppear
.onDisappear { }视图消失时调用(类似 viewDidDisappear
.task { }异步任务启动,视图消失时自动取消
.onChange(of: value) { }状态变化时响应

示例代码:

struct ContentView: View {@State private var text = "Hello"var body: some View {Text(text).onAppear {print("SwiftUI View Appeared")// 初始化数据}.onDisappear {print("SwiftUI View Disappeared")}.task {// 异步加载数据await loadData()}.onChange(of: text) { newValue inprint("Text changed to \(newValue)")}}
}

五、关键对比总结

概念UIKitSwiftUI
应用启动application(_:didFinishLaunching...)App协议 + onChange(of: scenePhase)
页面显示/隐藏viewWillAppear
/viewDidAppear
.onAppear
/.onDisappear
布局更新layoutSubviews()自动响应状态变化
异步任务手动管理(需在 viewDidDisappear取消).task自动取消
销毁deinit结构体自动释放

📌 最佳实践

  • UIKit:在 viewDidLoad 中初始化数据,在 viewWillAppear 中刷新 UI。
  • SwiftUI:用 .onAppear 替代 viewDidLoad + viewWillAppear,用 .task 处理异步。
  • 避免在 layoutSubviews() 中做耗时操作(可能频繁调用)。

掌握这些生命周期可避免内存泄漏、优化性能并确保正确的数据加载时机。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借助HarmonyOS SDK,《NBA巅峰对决》实现“分钟级启动”到“秒级进场”

《NBA巅峰对决》是由望尘科技推出的国内首个真实还原5V5王朝模式的操作篮球手游,提供流畅操作手感和真实篮球赛场体验。丰富的玩法在为玩家带来高质游戏体验的同时,间接带来了启动流程冗长的问题,资源更新阶段的等待感尤为突出。 “我们发现&…

HT-LINK ICE:海速芯32Gbps信号调理芯片,40dB补偿+国产自主,打破高速互联瓶颈!

HT-LINK ICE(TENX海速芯)产品解析与推广文案一、产品定位HT-LINK ICE是TENX海速芯推出的高速信号调理芯片,专为PCIe 5.0/6.0、USB4、Thunderbolt等超高速接口设计,提供信号完整性增强和时钟恢复功能,适用于数据中心、A…

深入剖析 ADL:C++ 中的依赖查找机制及其编译错误案例分析

一、ADL 的定义与背景(一)ADL 的定义ADL(Argument-Dependent Lookup,依赖查找)是 C 中一种特殊的名称查找机制,用于在调用函数时,根据函数参数的类型来确定查找的命名空间范围。ADL 的核心思想是…

【科研绘图系列】R语言绘制相关系数图

文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息参考介绍 【科研绘图系列】R语言绘制相关系数图 加载R包 library(vegan) library(dplyr)# install.packages("./RVisulizationData/003.mantel test/ggcor_0.9.8.1.tar.gz", repos = NULL, type = &quo…

pharokka phold--快速噬菌体注释工具

pharokka是一款专用于噬菌体基因组及宏基因组的快速标准化注释工具。PS.仍在积极更新中,最近一次更新是在今年6.20。 若需对细菌基因组进行快速标准化注释,建议使用Bakta。启发pharokka开发及命名的Prokka也是优秀选择,但Bakta实为Prokka的卓…

深入浅出 Python Asynchronous I/O:从 asyncio 入门到实战

在现代软件开发中,性能是一个永恒的话题。特别是在处理网络请求、文件读写等 I/O 密集型任务时,传统的同步编程模型可能会因为等待而浪费大量时间。为了解决这个问题,异步编程应运而生。Python 通过内置的 asyncio 库,为开发者提供…

OpenCV颜色矩哈希算法------cv::img_hash::ColorMomentHash

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该类实现了颜色矩哈希算法(Color Moment Hash),用于图像相似性比较。它基于图像在HSV颜色空间中的颜色矩统计特…

上海交大医学院张维拓老师赴同济医院做R语言训练营培训

当前,医学与人工智能的深度融合正迎来历史性发展机遇。华中科技大学同济医学院附属同济医院(以下简称“同济医院”)作为医疗人工智能应用的先行探索者,已在电子病历辅助书写、科研数据分析、医疗合同自动化审核等关键场景完成试点…

使用阿里云/腾讯云安装完成mysql使用不了

显示错误1130 - Host 106.228.110.117 is not allowed to connect to this MySQL server解决方案进入服务器的mysql命令行mysql -u root -p查看数据库SHOW DATABASES;选择mysql数据库USE mysql;查看里面的表SHOW TABLES;查询user表格的权限限制SELECT Host, User FROM user;将权…

第35周—————糖尿病预测模型优化探索

目录 目录 前言 1.检查GPU 2.查看数据 ​编辑 3.划分数据集 4.创建模型与编译训练 5.编译及训练模型 6.结果可视化 7.总结 前言 🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1.检查GPU import torch.n…

接口(上篇)

接口(上篇)1.概念2.语法规则3.使用和特性4.实现多接口5.接口间继承1.概念 接口就是公共的行为规范标准,大家在实现时, 只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规…

UE5 源码编译setup.bat报错

文章目录编译报错改动说明小结更新编译报错 改动说明 因为需要整服务器,就编译源码,然后就遇到这个,很无语。这个问题一直存在,UE官方也不修复,也算是修复了,只是每次都要去重新下载替换下。也可以去问问d…

Linux下PCIe子系统(二)——PCIe子系统框架详解

Linux下PCIe子系统(二)——PCIe子系统框架详解 1. 概述 PCIe(PCI Express)子系统是Linux内核中负责管理PCI/PCIe设备的核心组件。它提供了一套完整的框架来发现、配置和管理PCI设备,实现了设备的即插即用和热插拔功能。…

[特殊字符] LLM(大型语言模型):智能时代的语言引擎与通用推理基座

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 从千亿参数到人类认知的AI革命 🔍 一、核心定义与核心特征…

18-C#改变形参内容

C#改变形参内容 1.ref 参数 int A100; add1(ref A) public int add1 (ref int x) {x x 10;return x; }2.out 参数 int A100; int B200; int Z; add3(A,B, out Z) public int add3 (int x,int y,int z) {z x y;return z; }

恒盾C#混淆加密大师最新版本1.4.0更新 - 增强各类加密效果, 提升兼容性, 使.NET加密更简单

C#/.NET作为托管语言, 其编译生成的EXE/DLL极易被反编译工具还原源码。据统计,大量的商业软件曾遭遇过代码逆向风险,导致核心算法泄露、授权被跳过. 因此对于C#语言开发的.NET程序来说, 在发布前进行混淆和加密非常有必要. 恒盾C#混淆加密大师作为一款.N…

数学建模:非线性规划:二次规划问题

一、定义如果规划模型的目标函数是决策向量的二次函数,约束条件都是线性的,那么这个模型称为二次规划(QP)模型。二次规划模型的一般形式为二、性质凸性判定准则二次规划问题的凸性完全由Hessian矩阵H决定:​​严格凸QP…

4. 那在详细说一下 http 2.0 的特点

总结 二进制协议:文本通信改为二进制帧通信,数据可以划分为更小的帧,便于高效解析和传输。多路复用:废除 pipeline 管道,避免了“队头阻塞”问题。允许同一个 TCP 连接同时发送多个请求和协议,提高网络资源…

Qt中遍历QMap的多种方法及性能分析

Qt中遍历QMap的多种方法及性能分析遍历QMap的方法**1、使用迭代器&#xff08;STL风格&#xff09;****2、使用Java风格迭代器****3、使用C11范围循环****4、使用键值分离遍历**性能分析使用建议遍历QMap的方法 1、使用迭代器&#xff08;STL风格&#xff09; QMap<QStrin…

Unity3D物理引擎性能优化策略

前言 在Unity3D中优化物理引擎性能&#xff0c;尤其是处理3D碰撞器与2D碰撞器的映射问题&#xff0c;需要结合系统特性和最佳实践。以下是关键策略和实现方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀…