view的加载流程

view的加载流程,第1张

概述loadView的用法 转自:http://haoxiang.org/page/5/   UIViewController的loadView 用UIViewController有一段时间了,才发现以前对loadView的理解完全不到位。 假如我们用Xcode新建一个View-based Application,在ViewController.m中加上 - (void) loadView { NSL loadView的用法

转自:http://haoxiang.org/page/5/

 

UIVIEwController的loadVIEw

用UIVIEwController有一段时间了,才发现以前对loadVIEw的理解完全不到位。

假如我们用Xcode新建一个VIEw-based Application,在VIEwController.m中加上

- (voID) loadVIEw {
NSLog(@"loadVIEw Called");
}

再增加vIEwDIDLoad,按照一般的情况,我们会有这样的Code

- (voID) vIEwDIDLoad {
[super vIEwDIDLoad];
UIbutton *custombutton = [UIbutton buttonWith.....
......
[self.vIEw addSubVIEw:custombutton];
}

现在打开MainWindow.xib,删掉其中的VIEwController,并在AppDelegate.m的

- (BOol)application:(UIApplication *)application dIDFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

里增加VIEwController的初始化

vIEwController = [[XXXVIEwController alloc] init];

编译运行就有问题了。Console中不断的输出loadVIEw Called!

仔细的阅读loadVIEw的文档,才知道loadVIEw不是这么用的。

loadVIEw在每一次使用self.vIEw这个property,并且self.vIEw为nil的时候被调用,用以产生一个有效的self.vIEw。这个接口原本是为了让我们自定义view用的。在不被subclass实现的情况下,也就是[super loadVIEw]的效果,应该就是产生了一个有效的vIEw,也就是一个空白的vIEw。

在上面这种情况下,loadVIEw被实现为空(只有一条打印语句),而且我们没有通过XIB初始化VIEwController,所以在vIEwDIDLoad被执行时,self.vIEw是为nil的。所以在执行[self.vIEw addSubVIEw:custombutton]时,loadVIEw被调用,用来产生一个有效的vIEw,使得self.vIEw不再为nil。罢特,我们错了(-_-!)。我们的loadVIEw什么也没有做,于是就出现了上面的情形,不断的调用一个什么都不做的loadVIEw….

当然,我们只要在loadVIEw中增加一句[super loadVIEw]就没有问题了。但这并不是Cocoa的设计者所期望的。

loadVIEw仅仅应该在开发者希望自行通过编码而不是Interface Builder定制vIEw的时候被实现,而且不应该在其中调用[super loadVIEw],你的loadVIEw中应该有self.vIEw = …这样的行为。

如果仅仅是想要在当前vIEw上增加一些UIbutton或是UILabel,应该在vIEwDIDLoad里去做,此时不要实现自己的loadVIEw。

 

 

 

 

 

转自:http://www.cocoachina.com/bbs/simple/?t52059.html

loadVIEw VS vIEwDIDLoad

loadVIEw 和 vIEwDIDLoad 的区别

iPhone开发必不可少的要用到这两个方法 他们都可以用来在视图载入的时候,初始化一些内容 但是他们有什么区别呢?
vIEwDIDLoad 此方法在vIEw被  addsubWIEw后调用vIEwDIDLoad用于初始化,加载时用到的。 (不论是从xib中加载视图,还是从loadvIEw生成视图,都会被调用。)
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。 

 UIVIEwController 的内存管理
在 iOS3.0 后,UIVIEwController 多了一个叫做 vIEwDIDUnLoad 的方法。
   先看下 UIVIEwController 从创建 vIEw 到展示的流程的几个函数

    -init
    -initWithNibname:bundle:

这两个方法都是初始化一个 vc,但请注意 vIEw 不是这时候载入的

    -loadVIEw
    -vIEwDIDLoad

    当一个视图准备展现时,vc 首先会判断 vIEw 是否已经创建否则便通过之前指定的 xib 文件来初始化 vIEw,以及绑定其他关系(若没有指定 xib 文件,则默认会搜索和 vc 同名的 xib,比如 mynameVIEwController 就会搜索 mynameVIEwController.xib 文件)

    若是没有 xib 文件,你就可以在 loadvIEw 中自己手动创建这个 vIEwControoler 需要的视图。接下来就是调用到 -vIEwDIDLoad,许多人喜欢在这里做些其他事情,比如做个 http 请求、建立个数组啥的。这里若不处理正确,-vIEwDIDUnload 激活时内存就容易泄露了,稍后提到。

    -vIEw()appear
    -vIEw()disappear

    这几个方法就不解释了

    -vIEwDIDUnload

    该方法在收到内存警告,同时该视图并不在当前界面显示时候会被调用,此时该 controller 的 vIEw 已经被释放并赋值为 nil。
接下来你要做的是

把实例变量的子视图释放(IBOulet 的,以及自己添加的)
其他实例变量,比如之前在 -vIEwDIDLoaded 中实例的数据数组、http 请求释放掉
    因为当该 vIEwController 再次被激活准备显示时(比如 navigationControler 返回到上一级),vc 发现自己的 vIEw 为空后会重复之前的流程直到把 vIEw 给创建起来。若没将自己额外添加的子视图,各种类实例变量释放,这里便会重新再次创建。

    于是,内存泄露了。

 

 

注意iphone开发中的这两个函数vIEwWillAppear和vIEwDIDAppear
每当视图准备在屏幕上显示,或者视图已在屏幕上完全显示时,将调用这两个方法。

vIEwWillAppear:方法更新准备显示的视图的信息。调用时,视图可能还没有被加载。
使用vIEwDIDAppear:来触发视图完全显示在屏幕上之后的行为,例如任何动画。
vIEwdIDload是当程序第一次加载vIEw时调用,以后都不会用到,而vIEwDIDAppear是每当切换到vIEw时就调用。

loadVIEw和vIEwDIDLoad方法。假设不使用xib文件对视图布局,那么loadVIEw方法必须设置屏幕,并对任何子视图布局。每当继承一个具体的子类,例如UItableVIEwController或UITabbarController时,务必调用[super  loadVIEw]或者实现vIEwDIDLoad。这样一来,在进行定制之前,父类可以对屏幕进行适当的设置。当代码基于具体的子类时,苹果的文档和示例代码鼓励使用vIEwDIDLoad。
vIEwDIDLoad 此方法只有当vIEw从nib文件初始化的时候才被调用vIEwDIDLoad用于初始化,加载时用到的。
loadVIEw 此方法在控制器的vIEw为nil的时候被调用。 此方法用于以编程的方式创建vIEw的时候用到。loadVIEw是使用代码生成视图的时候,当视图第一次载入的时候调用的方法。用于使用(写)代码来实现控件。用于使用代码生成控件的函数。

vIEwDIDLoad,不论是从xib中加载视图,还是从loadvIEw生成视图,都会被调用。


另官方文档里关于   load cycle unload cycle 图示


总结

以上是内存溢出为你收集整理的view的加载流程全部内容,希望文章能够帮你解决view的加载流程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1055077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存