loadView 与 viewDidLoad 和 didReceiveMemoryWarning与viewDidUnload 详解
首先试验下:viewController初始化
-(void)loadView{
NSLog(@"=====执行loadView=====");
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"=====执行viewDidLoad=====");
}
运行结果:两个都打印出来了,说明两个方法都调用了;
同样试验下:
(说明下:ViewController_iPhone.xib文件视图背景设置为红色)
我们把self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone"bundle:nil] autorelease];改成self.viewController = [[[ViewController alloc] init] autorelease];
说明1:不论viewController调用那个初始化的方法进行,只有实现文件里面重载了loadView,viewDidLoad两个方法,必定会都执行,执行先后顺序是loadView---> viewDidLoad;
同样继续实验将[[[ViewController alloc] initWithNibName:@"ViewController_iPhone"bundle:nil] autorelease];换回
运行结果:界面是一片黑色!为什么xib设计的红色背景界面没有显示?
我们在实验一下:注释掉loadView的实现
结果:xib红色界面有显示了
再实验下:loadView的实现:
-(void)loadView{
UIView* view1 =[[UIView alloc]initWithFrame:CGRectMake(, , , )];
self.view=view1;
[view1 release];
self.view.backgroundColor=[UIColor greenColor];
NSLog(@"=====执行loadView=====");
}
结果:xib红色界面不但没有显示,反而显示了绿色。
说明2:只要.m实现文件中重载了loadView方法,那么:
if(可能1)
{系统直接过滤掉xib的加载,不加载xib界面文件及不执行相关加载xib的方法,反而依托loadview为他创建一个视图}
else if (可能2)
{
系统没有滤掉xib(红色背景的view)的加载,同样的执行了相关加载xib的方法,然后接着执行---->loadview方法;
也为他创建一个视图(绿色背景的view),这样后面创建的视图直接把xib界面给替换掉了(喜新厌旧模式)
}
我个人认为条件:可能2的分析更符合IOS系统的执行规则,同样如果哪个大牛有这本事,也可以看看IOS核心机制的执行,也许你能够一下子知道是哪种可能?是 可能1 呢 还是 可能2 ?如果哪位知道的,麻烦告诉下我,我这就不再继续深挖这个问题了。
说明3:xib的加载执行 跟 loadView 是等价的,加载视图时候,只选择一个就好,如果选择加载xib,那么实现文件就不需要去重载 loadView 方法,别做画蛇添足的事情。
同样说明4:不管 怎么是利用 xib 初始化视图 还是 loadView 初始化视图,viewDidLoad 都会执行的;
《2》调用init实现初始化视图viewController:
实验1:同样在.m文件中实现loadView 与 viewDidLoad
-(void)loadView{
NSLog(@"=====执行loadView=====");
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"=====执行viewDidLoad=====");
}
运行结果:都执行了,界面黑色;
说明1:说明视图自动默认创建一个黑色背景的视图
在实验:
-(void)loadView{
NSLog(@"=====执行loadView=====");
UIView* view1 =[[UIView alloc]initWithFrame:CGRectMake(, , , )];
self.view=view1;
[view1 release];
self.view.backgroundColor=[UIColor greenColor];
}
运行结果:界面绿色
说明:loadView 加载视图时,如果重载方法里面没有自己创建视图,那么系统也会默认创建一个视图;
综合说明:
1,loadView 与xib 一样是构建视图的,如果都没有用到,系统自动创建一个视图; 所以loadView 与xib构建视图,只要其中一个就好,viewDidLoad都会在viewController.view初始化后,执行的。也就说在loadView或者加载xib后,viewDidLoad才会执行,这样就可以在viewDidLoad里面做一些必要的变量初始化等等。或者直接不要用loadView方法,把视图(UIButton等等子视图)初始化放在viewDidLoad里面;
2,你在控制器中实现了 loadView 方法,那么你可能会在应用运行的某个时候被内存管理控制调用。 如果设备内存不足的时候, view 控制器会收到 didReceiveMemoryWarning 的消息。 默认的实现是检查当前控制器的 view 是否在使用。 如果它的 view 不在当前正在使用的 view hierarchy 里面,且你的控制器实现了 loadView 方法,那么这个 view 将被 release, loadView 方法将被再次调用来创建一个新的 view。
3,重载loadView这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。
如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。
4,viewDidUnload(在iOS 3.0以及更高版本中)这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用,来释放它的view以及view相关的对象。由于controller通常保存这view以及相关object的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收。但不要释放那些难以重建的数据。通常controller会保存nib文件建立的views的引用,但是也可能会保存着loadView函数创建的对象的引用。最完美的方法是使用合成器方法:self.myCertainView = nil;(隐性释放)
这样合成器会release这个view,如果你没有使用property,那么你得自己显示释放这个view。
所以流程应该是这样:
(loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views
—->当需要使用view时有回到第一步,如此循环
小插曲:viewDidUnload与didReceiveMemoryWarning的区别:
文档里说:在iphone 3.0以后 didReceiveMemoryWarning会调用viewDidUnload来清理内存;而不是向以前那样直接在didReceiveMemoryWarning中清理内存,3.0以后只需要重写viewDidUnload方法做清理内存即可;
1、当程序收到内存警告时候ViewController会调用didReceiveMemoryWarning这个方法。
2、调用了这个方法之后,对view进行释放并且调用viewDidUnload方法
3、从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。
loadView 与 viewDidLoad 和 didReceiveMemoryWarning与viewDidUnload 详解的更多相关文章
- 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方 ...
- loadView 和 viewDidLoad、viewDidunload 的区别
loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法. 他们都可以用来在视图载入的时候初始化一些内容. 但是他们有什么区别呢? viewDidLoad 方法只有当 ...
- iOS开发之loadView和viewDidLoad总结
http://www.1000phone.net/forum.php?mod=viewthread&tid=10507&extra=page%3D1%26filter%3Dauthor ...
- loadView与viewDidLoad不同 && loadView学习总结
loadView学习总结 UIViewController类或其子类会在初始化时创建一个UIView对象,会作为控制器的默认视图显示出来,可以通过self.view寻址访问.但没有调用loadView ...
- ##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告
##DAY3 自定义视图.视图控制器.视图控制器指定视图.loadView. viewDidLoad.MVC.屏幕旋转.内存警告 #pragma mark ———————自定义视图的步骤 —————— ...
- ios - loadView与viewDidload
从打印结果可以看出,先调用loadView再调用viewDidload 代码: // // ViewController.m // test // // Created by 裴波波 on 16/4/ ...
- loadView 与 ViewDidLoad
每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCod ...
随机推荐
- ARM汇编程序中的伪指令
转自http://blog.chinaunix.net/uid-13701930-id-336459.html 4.1 ARM汇编器所支持的伪指令 在ARM汇编语言程序里,有一些特殊指令助记符,这些助 ...
- MySQL语句基础
该笔记使用的数据库为MySQL-5.6.34,使用的建表语句为 : /* Navicat MySQL Data Transfer Source Server : 127.0.0.1 Source Se ...
- Delphi iOS & macOS App 名称支持国际化多语显示
作用:在 OSX 图标下方显示 App 中文繁体或简体的名称(系统自动选取) 适用:XE7, XE8 for OSX 操作: 创建一个新工程. 在工程目录下创建二个文件夹(zh_??.lproj)文件 ...
- java 异步调用与多线程
异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...
- Java之static静态代码块
Java之static静态代码块 构造代码块 使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域 public cl ...
- 蛋疼的Action.c (141): undeclared identifier `LAST'异常
之前这个脚本运行了很久都没有问题,今天突然在场景运行不了: Action.c (141): undeclared identifier `LAST' 害的老子一直在纠结,这个关联函数没有问题啊,怎么一 ...
- JavaScript数组升降序排列、最大值、最小值等
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- file.delete()的优化
//删除暂存的pdf File file =new File(pdfFilename); file.delete(); Path path2 = Paths.get(pdfFilename); Fil ...
- bzoj 2780: [Spoj]8093 Sevenk Love Oimaster(广义SAM)
题目大意:给出n个原串,再给出m个查询串.求每个查询串出现在了多少原串中. 题解 直接对原串建一个广义SAM,然后把每一个原串放到SAM上跑一跑,记录一下每一个状态属于多少个原串,用$size$表示. ...
- 大话AJAX原理
大话AJAX原理 一.什么是Ajax Ajax(Asynchronous JavaScript and XML的缩写)是一种异步请求数据的web开发技术,对于改善用户的体验和页面性能很有帮助.简单地说 ...