长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系
一、loadView
什么时候被调用?
- 每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。
有什么作用?
- loadView方法是用来负责创建UIViewController的view
默认实现是怎样的?
它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view
- 如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件
[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
- 如果没有明显地传xib文件名,就会加载跟UIViewController同名的xib文件
[[MJViewController alloc] init]; // 加载MJViewController.xib
- 如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件
如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性,大致如下
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
怎样正确使用这个方法?
- 大家都知道UIViewController的view可以通过xib文件来创建,但是在某些情况下,xib不是那么地灵活,所以有时候我们想通过代码来创建UIView,比如:
self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
- 如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],因为在第3点里面已经提到:若没有xib文件,[super loadView]默认会创建一个空白的UIView。我们既然要通过代码来自定义UIView,那么就没必要事先创建一个空白的UIView,以节省不必要的开销。正确的做法应该是这样:
- (void)loadView { self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease]; }
- 不需要调用[super loadView],你调用了也不会出错,只是造成了一些不必要的开销。
- 总结一句话,苹果设计这个方法就是给我们自定义UIViewController的view用的
- 大家都知道UIViewController的view可以通过xib文件来创建,但是在某些情况下,xib不是那么地灵活,所以有时候我们想通过代码来创建UIView,比如:
二、viewDidLoad
什么时候被调用?
- 不过你是通过xib文件还是重写loadView创建UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法
有什么作用?
- 一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中。
三、viewDidUnload
什么时候被调用?
- ios设备的内存是极其有限的,如果应用程序占用的内存过多的话,系统就会对应用程序发出内存警告。UIViewController就会收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默认实现是:如果当前UIViewController的view不在应用程序的视图层次结构(View Hierarchy)中,即view的superview为nil的时候,就会将view释放,并且调用viewDidUnload方法
有什么作用?
- 上面说到,发出内存警告且view被释放的时候就会调用viewDidUnload方法,所以一般在释放资源,主要是释放界面元素相关的资源,将相关的实例都赋值为nil
- (void)viewDidUnload { [super viewDidUnload]; self.name = nil; self.pwd = nil; }
- 上面说到,发出内存警告且view被释放的时候就会调用viewDidUnload方法,所以一般在释放资源,主要是释放界面元素相关的资源,将相关的实例都赋值为nil
dealloc也是用来释放资源的,那跟viewDidUnload有什么关系?
- 当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用
四、三个方法的关系
第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view
view创建完毕后会调用viewDidLoad方法进行界面元素的初始化
当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法
当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view
view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化
转载于:https://www.cnblogs.com/zhuyiios/p/6674659.html
长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系相关推荐
- 同学们,长路漫漫伴你闯
终于 最后一批学生也要启程了 不愿说离别伤感话 自古英雄出少年 相处多日 临别之时 无以相送 唯老歌一曲伴你走天涯 (挥手--) <长路漫漫任我闯>林子祥 长路漫漫任我闯 带一身胆色和热肠 ...
- 当我尝试写一个自动写小说的AI,长路漫漫的踩坑之路 ToT
起因 事情是这样的,前几天我在刷B站的时候看到一个大佬用训练了一个自动写高考作文的AI 链接: https://www.bilibili.com/video/BV1pr4y1w7uM 那我就想既然别人 ...
- 长路漫漫,java为伴之java学习路线篇
学习规划篇 作为一名java程序员,你需要了解你学习路线,下面就是规划了!!! 接下来对在实际开发中从上而下用到的各个部分说起: 1.前端 2.网关层 3.服务层 4.数据层 5.大数据 6.搜索引擎 ...
- 亚马逊CEO:Kindle电子阅读器彩色化仍长路漫漫
C114讯 北京时间5月27日午间消息(蒋均牧)亚马逊(Amazon)Kindle电子阅读器的彩色版终会到来,但不会很快. 周二在西雅图举行的年度在线零售商股东会上,亚马逊创始人兼首席执行官杰夫·贝索 ...
- 长路漫漫,唯剑作伴--Automatic Reference Counting
一.引用计数 在OC中,对象什么时候会被释放? 答案是当对象没有被任何变量引用(也可以说是没有指针指向该对象)的时候,就会被释放. 怎么知道对象已经没有被引用了呢? OC采用引用计数(referenc ...
- 测试归测试,自动驾驶向个人全面开放依然长路漫漫
来源:网易智能 摘要在北京某地,乘客们正等待着乘坐百度"阿波罗"无人驾驶汽车.最近,百度与福特汽车启动了为期两年的L4级别自动驾驶联合测试项目,在特定的地理区域和特定天气条件下行驶 ...
- 哥德尔奖得主Cynthia Dwork:实现算法公平性,长路漫漫
导读:像人一样,算法容易受到偏见的影响,这些偏见会使他们的决策"不公平".在决策过程中,公平是指根据个人或群体的固有或后天特性,对个人或群体不存在任何偏见或偏爱.随着偏见在现实世界 ...
- C++ 开篇 长路漫漫,以终为始!
给初学C++的职场新人的一些建议 1.了解语言基础:首先要掌握C++的基本概念和语法, 包括数据类型.运算符重载.面向对象编程等. 2.练习: 练习编写 C++ 代码以及解决常见问题,例如经典的算法和 ...
- 长路漫漫,何时尽头?
果断如师兄们所料,今天刚刚把过年接的项目交给老师验收,马上就收到了新的项目任务,之前还总在幻想,是不是老师觉得我们马上找工作了会在项目的事情上给我们收敛一点,但这又只是幻想,项目还是如期而至或者可以说 ...
最新文章
- 数据处理的两个基本问题05 - 零基础入门学习汇编语言42
- CentOS关机大法之shutdown应用实例
- 计算机视觉与深度学习 | K-means聚类算法在计算机视觉中的应用之图像分割
- GDCM:gdcm::TagPath的测试程序
- CSS3的background-size:可以设置高宽 百分比 最大大小 最小大小
- Sublime Text官方文档 中英文版本
- Linux上搭建Samba,实现windows与Linux文件数据同步
- pandas 基本使用
- 一些C#实用的方法汇总
- cogs2514 艺术
- 字节跳动-大数据研发面试准备
- matlab 曲线 标注,请问关于Matlab曲线标注问题
- Zstandard(Zstd)新型压缩算法代替Zlib 简单使用教程
- ARM 安装中文输入法
- IIR滤波器和FIR滤波器的区别与联系
- SpringBoot学习小结之Redis
- vue3+howler.js实现音频播放,兼容大多数音频格式
- 英特尔笔试题小整理DIY
- unity实现神笔马良效果
- 安卓Android手机系统内文件夹全解
热门文章
- RTP传输H264时的sps和pps的获取
- uniapp使用iconfont字体图标
- Linux 统计文件行数,字节数。
- React开发(153):ant design自定义列
- 前端学习(3329):闭包的形式5
- 前端学习(3303):函数组件组件子组件useRef聚焦
- Vue+Element!一千字带你编写合理的编辑,查看,新建!
- [html] 本地存储和cookie之间的区别是什么?
- [html] web workers有用过吗?能帮我们解决哪些问题?
- [css] 什么是脱离文档流?有什么办法可以让元素脱离标准的文档流?