loadView 与 viewDidLoad 和 didReceiveMemoryWarning与viewDidUnload 详解

首先试验下:viewController初始化

分两个支路:initWithNibName加载初始化 及 init 直接初始化;

《1》调用initWithNibName加载一个xib界面文件来实现初始化viewController:

在 self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone"bundle:nil] autorelease];

xib界面文件我已设置背景为红色

在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(0, 0, 320, 548)];

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(0, 0, 320, 548)];

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中去。

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

时间: 2024-08-14 21:47:49

loadView 与 viewDidLoad 和 didReceiveMemoryWarning与viewDidUnload 详解的相关文章

loadView、viewDidLoad及viewDidUnload使用方法及概念

本文目录 一.loadView 二.viewDidLoad 三.viewDidUnload 四.三个方法的关系 标题中所说的3个方法,都是UIViewController的方法,跟UIViewController的view属性的生命周期息息相关.接下来我会一一阐述它们的作用以及它们之间的联系. 一.loadView 1.什么时候被调用? 每次访问UIViewController的view(比如controller.view.self.view)而且view为nil,loadView方法就会被调用

iOS开发之loadView和viewDidLoad总结

http://www.1000phone.net/forum.php?mod=viewthread&tid=10507&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline iPhone开发必不可少的要用到这两个方法. 他们都可以用来在视图载入的时候,初始化一些内容. 但是他们有什么区别呢? viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用.viewDidLoad用于

loadView与viewDidLoad不同

loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法. 他们都可以用来在视图载入的时候初始化一些内容. 但是他们有什么区别呢? viewDidLoad 方法只有当 view 从 nib 文件初始化的,  viewDidLoad 用于初始化,加载时用到. loadView 方法在控制器的 view 为 nil 的时候被调用. 此方法用于以编程的方式创建 view 的时候用到.loadView 是使用代码生成视图的时候,当视图第一次载入的时候调用的方法.用于使用

loadView与viewDidLoad

loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法. 他们都可以用来在视图载入的时候初始化一些内容. 但是他们有什么区别呢? viewDidLoad 方法只有当 view 从 nib 文件初始化的时候才被调用.viewDidLoad 用于初始化,加载时用到. loadView 方法在控制器的 view 为 nil 的时候被调用. 此方法用于以编程的方式创建 view 的时候用到.loadView 是使用代码生成视图的时候,当视图第一次载入的时候调用的方法.

loadView和viewDidLoad及initWithNibName/awakeFromNib/initWithCoder

每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的. 一.loadView 永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数.如果你用IB创建view并初始化view controller

loadView 与 ViewDidLoad

每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的. 一.loadView 永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数.如果你用IB创建view并初始化view controller

IOS loadView 和 viewDidLoad 的区别

IOS 开发 loadView 和 viewDidLoad 的区别 iPhone开发必不可少的要用到这两个方法. 他们都可以用来在视图载入的时候,初始化一些内容. 但是他们有什么区别呢? viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用. loadView 此方法在控制器的view为nil的时候被调用. 此方法用于以编程的方式创建view的时候用到. 如: - ( void ) loadView { UIView *view = [ [ UIView alloc] i

loadView和viewDidLoad

之前虽然用过loadView和viewDidLoad这两个方法,但没有仔细研究过,现在反过头来看下. 这些方法的执行顺序位loadView——>viewDidLoad——>viewWillAppear——>viewDidAppear①loadView是在每次访问uiviewController的view(如self.view或controller.view),并且view为nil时才会调用.作用就是创建UIViewController的view即若想自定义UIviewController

UIScrollView 原理详解

UIScrollView 原理详解 ScrollView UIScrollView UIScrollView为了显示多于一个屏幕的内容或者超过你能放在内存中的内容. Scroll View为你处理缩小放大手势,UIScrollView实现了这些手势,并且替你处理对于它们的探测和回应.其中需要注意的子类是UITableView以及UITextView(用来显示大量的文字).还有一个UIWebView,尽管那不是UIScrollView的直接子类,它适用UIScrollView去显示网页内容 con