view 生命周期

每个ios开发者对loadViewviewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的.

一、loadView

永远不要主动调用这个函数。view controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数,且不要在重载的时候调用[super loadview]。如果你用IB创建view并初始化view controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数。

这个方法系统的默认实现是这样:

1;寻找有关可用的nib文件的信息,根据这个信息来加载nib文件       //所以,nib的加载过程是在loadview中完成的哦。

2;如果没有有关nib文件的信息,默认创建一个空白的UIView对象,然后把对象成赋值给view controller的主view。

所以,如果你决定重载这个函数时,你也应该完成这些步骤:

把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super,这个也是为了保持主view与controller的单一映射关系。

二、viewDidLoad

这个函数在controller加载了相关的views后被调用,而不论这些views存储在nib文件里还是在loadView函数中生成。

这个函数的作用主要是让你可以进一步的初始化你的views。viewDidLoad通常负责的是view及其子view被加载进内存之后的数据初始化的工作,即视图的数据部分的初始化。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。

其多数情况下是做nib文件的后续工作。

三、viewDidUnload

这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用,来释放它的view以及view相关的对象。由于controller通常保存着view以及相关object的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收。但不要释放那些难以重建的数据。

通常controller会保存nib文件建立的views的引用,但是也可能会保存着loadView函数创建的对象的引用。最完美的方法是使用合成器方法:


1

self.myCertainView
=
nil;

这样合成器会release这个view,如果你没有使用property,那么你得自己显式释放这个view。

四、结论

所以流程应该是这样:

loadView来加载view(无论nib文件或自定义的views)到内存 ——>viewDidLoad函数进一步初始化这些view (通常是侧重于数据data的初始化)——>内存不足时,调用viewDidUnload函数释放views

—->当需要使用view时又回到第一步

如此循环

需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Builder)中有时候就会迷糊.其实也很好区分,孤零零地创建了一个nib文件,没有和其他可被实例化的类有直接或间接关系的时候,这个类或这些类(一个nib文件也可能包含多个类)是没有机会被实例化的,所以这种情况只是通过ib创建了一个类,而没有实例化.真正的实例化还需要通过在Xcode用代码来读取这个nib文件.知道这两这的区别后这些方法也就容易辨认多了

viewDidLoad其实没什么可混淆的,无论通过什么途径加载(Xcode或者IB,这里的加载属于实例化)完view后肯定会执行这个方法.

loadView需要分两种情况.当你通过Xcode实例化一个类的时候就需要自己在controller中实现这个方法.而在IB中实例化就不需要实现它.

initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的.

initWithCoder是一个类在IB中创建但在xocdde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xcode中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.

awakeFromNib 
当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象时执行awakeFromNib

viewDidLoad 
当view对象被加载到内存后就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad 。

时间: 2024-11-05 18:51:35

view 生命周期的相关文章

OC中View生命周期

说到view的生命周期一般都是指视图控制器的view生命周期. 首先判断控制器是否有视图,如果没有就调用loadView方法创建.过程如下:红色虚线框可以忽略,一般不会用. 生命周期如下: 1. loadView: 视图控制器(UIViewController)及其子类,无论是手写代码还是storyboard.xib肯定会调用此方法(此方法的调用是懒加载的).其它的视图不会调用比如UIButton,UILabel等,因为他们不是视图控制器. Storyboard/XIB会调用的方法: initW

深入懂得android view 生命周期

作为自定义 view 的基础,如果不了解android  view 的生命周期 , 那么你将会在后期的维护中发现这样那样的问题 ....... 做过一段时间android 开发的同学都知道,一般 onXXX 函数都是系统的回调函数.而这篇 blog 也是基于这个思想(或许有点笨)......   首先来看三分  创建view 的 日志信息 (自定义View 配置到xml文件中): android:visibility=gone 03-25 19:56:55.934: D/yyyyy(11493)

控制器view生命周期

控制器View的生命周期方法:只要是控制器的生命周期方法,都是以view开头. 控制器View加载完成时调用- (void)viewDidLoad { [super viewDidLoad];} 控制器的View显示完成时调用-(void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated];} 控制器的View即将显示的时候调用-(void)viewWillAppear:(BOOL)animated{ [super viewW

深入理解android view 生命周期

作为自定义 view 的基础,如果不了解Android  view 的生命周期 , 那么你将会在后期的维护中发现这样那样的问题 ....... 做过一段时间android 开发的同学都知道,一般 onXXX 函数都是系统的回调函数.而这篇 blog 也是基于这个思想(或许有点笨)...... 首先来看三分  创建view 的 日志信息 (自定义View 配置到xml文件中): android:visibility=gone [html] view plain copy 03-25 19:56:5

android view生命周期

onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure( int ,  int ) 确定所有子元素的大小 onLayout( boolean ,  int ,  int ,  int ,  int ) 当View分配所有的子元素的大小和位置时触发 onSizeChanged( int ,  int ,  int ,  int ) 当view的大小发生变化时触发 onDraw(Canvas) view渲染内容的细节 onKeyDown( int , 

view生命周期

Android View的生命周期详解

View生命周期相关方法: onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure( int ,  int ) 确定所有子元素的大小 onLayout( boolean ,  int ,  int ,  int ,  int ) 当View分配所有的子元素的大小和位置时触发 onSizeChanged( int ,  int ,  int ,  int ) 当view的大小发生变化时触发 onDraw(Canvas) view渲染内容的细节 onK

[ IOS ] iOS-控制器View的创建和生命周期

reference to  : 1. 控制器View的创建 首先我们来看一下控制器view创建的流程图 控制器view加载.jpeg 从图中我们可以看出,在控制器view加载过程中有两个重要的方法loadView和viewDidLoad.下面我们来重点了解一下这两个方法. loadView方法 作用:loadView方法是用来负责创建UIViewController的view.首先判断下有没有指定storyboard或者xib,如果指定,就会加载它们描述的控制器的view,如果没有指定,创建一个

WebApp中的页面生命周期及路由管理

最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在其中尽显无遗. 说说自己对Backbone优缺点的看法. Backbone确实是优秀的单页MVC框架,Events自定义事件机制,为Model/View/Colllection提供基础模块通信,Aync模块封装了CRUD的ajax操作,Router/History为开发者提供了路由机制,从很大程度上