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

UIViewController生命周期

生命周期

viewController有自己的生命周期,如图:

  • init:初始化程序

  • loadView() 当需要展示UIViewController的view为空时调用

  • viewDidLoad() 视图加载完成后调用,类成员对象和变量的初始化都在这里再创建类后无论视图展现还是消失,这个方法都只会在布局时调用一次

  • viewWillAppear() 视图即将展现时调用

  • viewDidAppear() 视图已经出现时调用

  • viewWillLayoutSubviews() 用于处理视图布局时的变化,通常在这里执行与布局相关的操作,在子视图重新布局之前调用

  • viewDidLayoutSubviews() 用于处理视图布局的变化, 在子视图重新布局结束后调用

  • viewWillDisappear() 视图即将消失时调用

  • viewDidDisappear() 视图已经消失时调用

  • traitCollectionDidChange() 视图控制器的特征集合发生变化时调用

  • didRecieveMemoryWarning() 系统内存不足时调用

初始化

init方法:初始化UIViewController,执行关键数据初始化操作,不要在此操作view,view只有在loadView:方法中才调用(UIViewController的view是懒加载实现的),在init方法中,view还没创建,用不了self.view。

加载视图

  • loadView:方法是在UIViewcontroller对象被访问且为nil时调用,该方法会加载并创建一个view并将其赋值给自身的view属性。没有特别情况该方法在viewcontrollrer中只调用一次。可以重写该方法手动初始化view。该方法中不能使用super(如果完全自己画UI的话)

  • viewDIdLoad:view加载完成后调用,通常情况下,各种初始化数据的载入、初始设定,修改约束,移除视图等很多操作都可以在这个方法中实现‘

  • viewWillAppear:系统在载入所有的数据后,将会在屏幕上显示视图,这时会先调用这个方法,通常会在这个方法中对即将显示的视图做进一步设置。

  • viewDidAppear:UIViewController对象的视图已经加载到窗口时调用,可以对正在显示的视图做设置

  • viewWillDisAppear:视图控制器对象即将消失、被覆盖或者隐藏时调用

  • viewDidDisAppear:视图控制器对象已经消失、被覆盖、或是隐藏时调用

内存警告

didRecieveMemoryWarning: 在内存足够的情况下,app的视图通常会一直报存在内存中。如果内存不够,系统会向app发送内存警告,此时会调用该方法。会释放掉自己拥有的视图。系统只会释放内存,不会释放对象的所有权。就是说对象仍然存在,但是内部的数据被释放了。

视图销毁

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

注意

viewDidload可能调用多次,而loadView只调用一次(一般情况下)

示例

#import <UIKit/UIKit.h>
​
NS_ASSUME_NONNULL_BEGIN
​
@interface FirstVC : UIViewController
​
@end
​
NS_ASSUME_NONNULL_END
​
​
#import "FirstVC.h"
#import "SecondVC.h"
@interface FirstVC ()
​
@end
​
@implementation FirstVC
​
- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor yellowColor];self.title = @"视图一";// Do any additional setup after loading the view.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {SecondVC* vc = [[SecondVC alloc] init];[self.navigationController pushViewController:vc animated:YES];
}
@end
#import <UIKit/UIKit.h>
​
NS_ASSUME_NONNULL_BEGIN
​
@interface SecondVC : UIViewController
​
@end
​
NS_ASSUME_NONNULL_END
​
#import "SecondVC.h"
​
@interface SecondVC ()
​
@end
​
@implementation SecondVC
​
- (void)viewDidLoad {[super viewDidLoad];self.title = @"视图二";self.view.backgroundColor = [UIColor systemBlueColor];// Do any additional setup after loading the view.NSLog(@"%s", __func__);
}
​
- (void)loadView {[super loadView];NSLog(@"%s", __func__);
}
​
- (instancetype)init {self = [super init];NSLog(@"%s", __func__);return self;
}
​
- (void)viewWillAppear:(BOOL)animated {NSLog(@"%s", __func__);
}
​
- (void)viewDidAppear:(BOOL)animated {NSLog(@"%s", __func__);
}
​
- (void)viewWillLayoutSubviews {NSLog(@"%s", __func__);
}
​
- (void)viewWillDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}
​
- (void)viewDidDisappear:(BOOL)animated {NSLog(@"%s", __func__);
}
​
- (void)viewDidLayoutSubviews {NSLog(@"%s", __func__);
}
​
​
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {[self.navigationController popViewControllerAnimated:YES];
}
/*
#pragma mark - Navigation
​
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/
​
@end
​

我们打印出结果如下


文章转载自:

http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://00000000.phhqL.cn
http://www.dtcms.com/a/367781.html

相关文章:

  • 大文件断点续传解决方案:基于Vue 2与Spring Boot的完整实现
  • 商城系统——项目测试
  • Ubuntu镜像源配置
  • 【C语言】第二课 基础语法
  • 机器学习基础-day07-项目案例
  • 无开机广告,追觅一口气推出三大系列高端影音新品该咋看?
  • Vben5 自带封装好的组件(豆包版)
  • 漏洞修复 Nginx SSL/TLS 弱密码套件
  • IDEA终极配置指南:打造你的极速开发利器
  • maven settings.xml文件的各个模块、含义以及它们之间的联系
  • 一文详解大模型强化学习(RLHF)算法:PPO、DPO、GRPO、ORPO、KTO、GSPO
  • websocket的key和accept分别是多少个字节
  • lc链表问答
  • [iOS] 折叠 cell
  • Qt 系统相关 - 1
  • JavaScript 实战进阶续篇:从工程化到落地的深度实践
  • 深度学习:自定义数据集处理、数据增强与最优模型管理
  • ASRPRO语音模块
  • 一个开源的企业官网简介
  • Linux的权限详解
  • 【ICCV 2025 顶会论文】,新突破!卷积化自注意力 ConvAttn 模块,即插即用,显著降低计算量和内存开销。
  • HTB Jerry
  • 微信支付--在线支付实战,引入Swagger,定义统一结果,创建并连接数据库
  • 为什么串口发送一串数据时需要延时?
  • 决策树算法详解:从原理到实战
  • 生成式AI优化新纪元:国产首个GEO工具的技术架构剖析
  • 2025年高教社杯全国大学生数学建模竞赛B题思路(2025数学建模国赛B题思路)
  • 【C语言】第一课 环境配置
  • git命令行打patch
  • day2today3夏暮客的Python之路