loadView 和 viewDidLoad、viewDidunload 的区别
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法。 他们都可以用来在视图载入的时候初始化一些内容。 但是他们有什么区别呢?
viewDidLoad 方法只有当 view 从 nib 文件初始化的时候才被调用。viewDidLoad 用于初始化,加载时用到。
loadView 方法在控制器的 view 为 nil 的时候被调用。 此方法用于以编程的方式创建 view 的时候用到。loadView 是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。如:
- ( void ) loadView {
UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view setBackgroundColor:_color] ;
self.view = view;
[ view release] ;
}
你在控制器中实现了 loadView 方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到 didReceiveMemoryWarning 的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view hierarchy 里面,且你的控制器实现了 loadView 方法,那么这个 view 将被 release, loadView 方法将被再次调用来创建一个新的 view。
********************************************************************************************************************************************************************************************
一、loadView
1.什么时候被调用?
每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。
2.有什么作用?
loadView方法是用来负责创建UIViewController的view
3.默认实现是怎样的?
默认实现即[super loadView]里面做了什么事情。
1> 它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view
- 如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件
[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
- 如果没有明显地传xib文件名,就会加载跟UIViewController同名的xib文件
[[MJViewController alloc] init]; // 加载MJViewController.xib
2> 如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性,大致如下
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
// applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}
[super loadView]里面就大致完成1>和2>中叙述的内容
4.怎样正确使用这个方法?
大家都知道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,以节省不必要的开销。正确的做法应该是这样:
1 - (void)loadView {
2 self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
3 }
不需要调用[super loadView],你调用了也不会出错,只是造成了一些不必要的开销。
总结一句话,苹果设计这个方法就是给我们自定义UIViewController的view用的
二、viewDidLoad
1.什么时候被调用?
无论你是通过xib文件还是重写loadView方法创建UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法
2.有什么作用?
一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中。例如:

1 - (void)viewDidLoad
2 {
3 [super viewDidLoad];
4
5 // 添加一个按钮
6 UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
7 [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
8 [self.view addSubview:button];
9 }

三、viewDidUnload
1.什么时候被调用?
iOS设备的内存是极其有限的,如果应用程序占用的内存过多的话,系统就会对应用程序发出内存警告。UIViewController就会收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默认实现是:如果当前UIViewController的view不在应用程序的视图层次结构(View
Hierarchy)中,即view的superview为nil的时候,就会将view释放,并且调用viewDidUnload方法
2.有什么作用?
上面说到,发出内存警告且view被释放的时候就会调用viewDidUnload方法,所以一般在释放资源,主要是释放界面元素相关的资源,将相关的实例都赋值为nil
1 - (void)viewDidUnload {
2 [super viewDidUnload];
3 self.name = nil;
4 self.pwd = nil;
5 }
3.dealloc也是用来释放资源的,那跟viewDidUnload有什么关系?
当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用
四、三个方法的关系
1.第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view
2.view创建完毕后会调用viewDidLoad方法进行界面元素的初始化
3.当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法
4.当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view
5.view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化
转载于:http://www.cnblogs.com/mjios/archive/2013/02/26/2933667.html
loadView 和 viewDidLoad、viewDidunload 的区别的更多相关文章
- loadView 与 viewDidLoad 和 didReceiveMemoryWarning与viewDidUnload 详解
首先试验下:viewController初始化 分两个支路:initWithNibName加载初始化 及 init 直接初始化: <1>调用initWithNibName加载一个xib界面 ...
- iOS开发之loadView、viewDidLoad及viewDidUnload的关系
iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系 标题中所说的3个方 ...
- ViewController 的loadView、viewDidLoad、viewDidUnload分别是什么时候调用的,在自定义ViewCointroller时在这几个函数中应该做什么工作?
由init.loadView.viewDidLoad.viewDidUnload.dealloc的关系说起 init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) init方法中初 ...
- IOS中的ViewController 的loadView、viewDidLoad、viewDidUnload
由init.loadView.viewDidLoad.viewDidUnload.dealloc的关系说起: 1 init方法 在init方法中实例化必要的对象(遵从LazyLoad思想) init方 ...
- iOS开发之loadView和viewDidLoad总结
http://www.1000phone.net/forum.php?mod=viewthread&tid=10507&extra=page%3D1%26filter%3Dauthor ...
- loadView 与 ViewDidLoad
每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCod ...
- loadView与viewDidLoad不同 && loadView学习总结
loadView学习总结 UIViewController类或其子类会在初始化时创建一个UIView对象,会作为控制器的默认视图显示出来,可以通过self.view寻址访问.但没有调用loadView ...
- ios - loadView与viewDidload
从打印结果可以看出,先调用loadView再调用viewDidload 代码: // // ViewController.m // test // // Created by 裴波波 on 16/4/ ...
- ##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告
##DAY3 自定义视图.视图控制器.视图控制器指定视图.loadView. viewDidLoad.MVC.屏幕旋转.内存警告 #pragma mark ———————自定义视图的步骤 —————— ...
随机推荐
- CentOS编译安装php7.2
介绍: 久闻php7的速度以及性能那可是比php5系列的任何一版本都要快,具体性能有多好,建议还是先尝试下再说.如果你是升级或新安装,那你首先需要考虑php7和程序是否存在兼容性,如果程序是基于php ...
- Python基础之路
一.Python基础之简介 二.Python基础之数据类型 三.Python之运算符 三.Python变量 四.Python之流程控制 三.Python基础之函数 四.Python基础之面向对象
- {Reship}{Sparse Representation}稀疏表示
===================================================== http://blog.sina.com.cn/s/blog_6d0e97bb01015wo ...
- 【DUBBO】dobbo的application的配置项
Dubbo:application的配置项[一]:配置项 <dubbo:application name="服务名字" owner="拥有者" organ ...
- matplotlib ----- 清空图片
关闭单个图: fig = plt.figure(0) # 新图 0 plt.savefig() # 保存 plt. close(0) # 关闭图 0 关闭所有图不用管 fig 号码 fig = p ...
- JDBC的概念、实现原理与连接数据库的几种方法
1.首先要知道jdbc(概念): 使用Java代码发送sql语句的技术就是jdbc技术(jdbc英文全称:Java DataBase Connectivity,java数据库连接).即jdbc是一个接 ...
- docker 镜像导入导出[转]
0)查看镜像id sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/calico/node v1.0.1 c70511a4 ...
- JFreeChart API 说明(转)
原地址 http://blog.csdn.net/mike_caoyong/article/details/7338160 JFreeChart目前是最好的java图形解决方案,基本能够解决目前的图形 ...
- li布局问题
问题示意,好多网站一般都有这种布局,如 问题主要原因,第一个li没有margin-left 其余有(这里只考虑一排的情况) 第一种解决方式: <!DOCTYPE html> <htm ...
- 加载内核模块-Unknown symbol错误分析
Unknown symbol 说明 有些函数不知道(未定义). 在调试过程中,发现一个问题,编译生成一个KO文件,insmod加载后报错: Unknown symbol var_set_intege ...