当前位置: 首页 > news >正文

swift开发,关于应用、页面、视图的生命周期

目录

      • 一、应用生命周期(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.dtcms.com/a/272610.html

相关文章:

  • [C++ STL] list类的刨析及简易实现
  • 亚马逊首个“海折节”,缘何加码进口电商?
  • java多线程环境下资源隔离机制ThreadLocal详解
  • C#内插字符串:从语法糖到深度优化
  • 学习笔记(32):matplotlib绘制简单图表-数据分布图
  • 入门级别的Transformer模型介绍
  • Rust中Option和Result详解
  • 微调性能赶不上提示工程怎么办?Can Gradient Descent Simulate Prompting?——论文阅读笔记
  • Apache Shiro 框架详解
  • 【三维生成】FlashDreamer:基于扩散模型的单目图像到3D场景
  • Express 入门指南(超详细教程)
  • 机器学习之逻辑回归和k-means算法(六)
  • 32多串300A保护板测试仪:新能源电池安全的核心守护者
  • 生成式人工智能实战 | 自注意力生成对抗网络(Self-Attention Generative Adversarial Network, SAGAN)
  • 深入理解fork():系统调用创建进程的原理与实践
  • 项目部署:nginx的安装和配置
  • 利用Pandas进行条件替换与向前填充
  • Linux中的命令连接符
  • Layui —— select
  • 图解Java数据容器(三):Queue
  • CAS登录工作流程简述
  • 【前端】【Echarts】ECharts 词云图(WordCloud)教学详解
  • Prompt提示词的主要类型和核心原则
  • 在vscode中和obsidian中使用Mermaid
  • Spring AI Alibaba(2)——通过Graph实现工作流
  • Flutter 与 Android 的互通几种方式
  • Linux 中 sed 命令
  • RedisJSON 路径语法深度解析与实战
  • Spring Boot + Javacv-platform:解锁音视频处理的多元场景
  • 【TCP/IP】12. 文件传输协议