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

【iOS】UIViewController生命周期

UIViewController的生命周期

  • 前言
  • UIViewController函数
    • 初始化
    • 加载视图
    • 内存警告
    • 视图销毁
  • 总结

前言

在iOS开发中,UIViewController是一个很重要的概念。在学习MVC中,我们知道它是view和model的桥梁。UIViewController作为UIKit中最基本的一个类,我们很有必要学习了解一下UIViewController的生命周期。

UIViewController函数

首先我们展示一下UIViewController整个生命周期的执行流程图:

在这里插入图片描述
为了更直观的感受整个UIViewController生命周期的执行流程,这里通过一个demo来NSLog一下函数:

#import "AViewController.h"
#import "BViewController.h"@interface AViewController ()@property(nonatomic, strong) UIButton *btn;@end@implementation AViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];self.btn = [UIButton buttonWithType:UIButtonTypeSystem];[self.btn setTitle:@"去B" forState:UIControlStateNormal];[self.btn addTarget:self action:@selector(pressBtn) forControlEvents:UIControlEventTouchUpInside];self.btn.frame = CGRectMake(100, 300, 50, 50);[self.view addSubview:self.btn];
}-(void)pressBtn {BViewController *bVC = [[BViewController alloc] init];NSLog(@"A到B");bVC.modalPresentationStyle = UIModalPresentationFullScreen;[self presentViewController:bVC animated:YES completion:nil];
}-(void)loadView {[super loadView];NSLog(@"%s", __func__);//预定义标识符,表示当前函数名
}-(void)viewWillAppear:(BOOL)animated {NSLog(@"%s", __func__);
}-(void)viewWillLayoutSubviews {NSLog(@"%s", __func__);
}-(void)viewDidLayoutSubviews {NSLog(@"%s", __func__);
}-(void)viewDidAppear:(BOOL)animated {NSLog(@"%s", __func__);
}-(void)viewWillDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}-(void)viewDidDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}@end
#import "BViewController.h"@interface BViewController ()@property(nonatomic, strong) UIButton *btn;@end@implementation BViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor greenColor];self.btn = [UIButton buttonWithType:UIButtonTypeSystem];[self.btn setTitle:@"去A" forState:UIControlStateNormal];self.btn.frame = CGRectMake(100, 300, 50, 50);[self.btn addTarget:self action:@selector(pressBtn) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:self.btn];
}-(void)pressBtn {NSLog(@"B到A");[self dismissViewControllerAnimated:YES completion:nil];
}-(void)loadView {[super loadView];NSLog(@"%s", __func__);
}-(void)viewWillAppear:(BOOL)animated {NSLog(@"%s", __func__);
}-(void)viewWillLayoutSubviews {NSLog(@"%s", __func__);
}-(void)viewDidLayoutSubviews {NSLog(@"%s", __func__);
}-(void)viewDidAppear:(BOOL)animated {NSLog(@"%s", __func__);
}-(void)viewWillDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}-(void)viewDidDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}@end

在这里插入图片描述

这样我们就能从输出直观的看出整个UIViewController的执行顺序:

在这里插入图片描述

具体介绍一下每个方法:

初始化

init(coder:) 或 init(nibName:bundle:) :初始化。

比较 init 方法和 initWithCoder: 方法:

  • init:用于代码中直接初始化对象,手动通过alloc init创建对象。
  • initWithCoder:
    • NSCoding(负责归档解档的协议)协议中需要实现的方法。
    • xib、storyboard中的UI元素初始化加载时调用。

加载视图

  • loadView():当view需要被展示而它却是nil时,ViewController会调用该方法。
    • 如果是代码创建的控制器,系统会创建一个空白的UIView并赋给self.view,因此需要重写。
    • 如果控制器是从Storyboard/XIB加载的,系统会自动将nib文件里的根视图赋给self.view,因此一般不需要重写。
  • viewDidLoad():最常用的方法,类成员对象和变量的初始化写在该方法中。但是在类创建后无论视图展现还是消失,这个方法只能调用一次。

注意⚠️:着重区分一下loadView()和viewDidLoad():

  • 触发时间:
    • loadView():view第一次被访问时
    • viewDidLoad():在loadView()执行完后触发
  • 主要职责:
    • loadView():创建并设置self.view
    • viewDidLoad():做视图额外的初始化

形象的说,loadView()好比建房子,viewDidLoad()好比装修房子。

  • viewWillAppear():视图将要展现出来时调用。
  • viewDidAppear():视图已经展现出来后调用。
  • 用于处理视图布局的变化,通常在这里执行与布局相关的操作:
    • viewWillLayoutSubviews():子视图重新布局前被调用。
    • viewDidLayoutSubviews():子视图重新布局后被调用。
  • viewWillDisappear():视图即将消失时调用。
  • viewDidDisappear():视图已经消失时调用。
  • traitCollectionDidChange():当视图控制器的环境特征发生变化时调用,比如深色模式切换、横竖屏切换、多任务分屏导致的size class变化等。用于响应界面环境变化,更新UI样式。

内存警告

didReceiveMemoryWarning():当系统检测到内存不足时调用,用于释放不必要的内存资源。

视图销毁

dealloc():当对象的引用计数为0时自动调用,销毁视图,释放资源。

总结

以上就是我学习的UIViewController生命周期小结。


文章转载自:

http://71IQKkho.bpptt.cn
http://jIv5GBeY.bpptt.cn
http://t3jJfdbT.bpptt.cn
http://LuOVZ1e5.bpptt.cn
http://UnqVj8tF.bpptt.cn
http://q1CtodR1.bpptt.cn
http://pdX62AlN.bpptt.cn
http://63bpQbI0.bpptt.cn
http://p6kSa1Bp.bpptt.cn
http://eNxv1GEN.bpptt.cn
http://sQRoo1IF.bpptt.cn
http://jxa7Kogj.bpptt.cn
http://xqxjBmem.bpptt.cn
http://fidPQD1E.bpptt.cn
http://J0nDybA6.bpptt.cn
http://2NXseXSt.bpptt.cn
http://396z9a4E.bpptt.cn
http://0har1GYv.bpptt.cn
http://GCjufCPb.bpptt.cn
http://YgcSwA8w.bpptt.cn
http://ZzVIzjxx.bpptt.cn
http://UyrEOzUG.bpptt.cn
http://0Uimeakz.bpptt.cn
http://zkvXGXlk.bpptt.cn
http://t4qm2rM3.bpptt.cn
http://69fJW2Xd.bpptt.cn
http://lzEquORI.bpptt.cn
http://vbGZ73w0.bpptt.cn
http://cE89by1s.bpptt.cn
http://NJd4bATr.bpptt.cn
http://www.dtcms.com/a/379012.html

相关文章:

  • 硬件开发(7)—IMX6ULL裸机—led进阶、SDK使用(蜂鸣器拓展)、BSP工程目录
  • 人工智能学习:Transformer结构中的编码器层(Encoder Layer)
  • RISCV中PLIC和AIA的KVM中断处理
  • 掌握梯度提升:构建强大的机器学习模型介绍
  • 全球智能电网AI加速卡市场规模到2031年将达20216百万美元
  • springbook3整合Swagger
  • LMS 算法:抗量子时代的「安全签名工具」
  • CUDA中thrust::device_vector使用详解
  • Python学习-day8 元组tuple
  • 2025主流大模型核心信息
  • skywalking定位慢接口调用链路的使用笔记
  • LeetCode刷题记录----739.每日温度(Medium)
  • eNSP华为无线网测试卷:AC+AP,旁挂+直连
  • 开源多模态OpenFlamingo横空出世,基于Flamingo架构实现图像文本自由对话,重塑人机交互未来
  • 光路科技将携工控四大产品亮相工博会,展示工业自动化新成果
  • matlab实现相控超声波成像仿真
  • 【C】Linux 内核“第一宏”:container_of
  • Dinky 是一个开箱即用的一站式实时计算平台
  • Vue3内置组件Teleport/Suspense
  • Python打印格式化完全指南:掌握分隔符与行结尾符的高级应用
  • 实体不相互完全裁剪,请检查您的输入
  • 分数阶傅里叶变换(FRFT)的MATLAB实现
  • ARM (6) - I.MX6ULL 汇编点灯迁移至 C 语言 + SDK 移植与 BSP 工程搭建
  • unsloth微调gemma3图文代码简析
  • 【ECharts ✨】ECharts 自适应图表布局:适配不同屏幕尺寸,提升用户体验!
  • wpf依赖注入驱动的 MVVM实现(含免费源代码demo)
  • Python的f格式
  • 技术视界 | 末端执行器:机器人的“手”,如何赋予机器以生命?
  • 从零开始使用 axum-server 构建 HTTP/HTTPS 服务
  • 简直有毒!索伯ACL撕裂,雷霆四年报销三个新秀!