`

[转]loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

阅读更多
作者:禚来强 邮箱:zhuolaiqiang@gmail.com 转帖请保留

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

昨天看了下苹果官方的相关文档以及几篇相关内容的网页(一 二 三),其实这个内容以前也看过,似乎也搞清楚了,可还是忘了.好急性不如烂笔头,这次一定要好好记下来.

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

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

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

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

awakeFromNib这个方法是一个类在IB中被实例化是被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用awakeFromNib,应为viewDidLoad会被多次调用,而awakeFromNib只会当从nib文件中unarchive的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.

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


如果你的对象是UIViewControler的子类,那么你必须调用- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;方法去调用NIB文件初始化自身,即使那没有使用nib文件也会调用这个函数(默认情况下init方法已经为你的做这件事情了),如果你调用这个方法,并传递的两个参数为空(nil),然后类会调用-loadView去读取一个名字和你的UIViewController名字相同的nib文件,来初始化自身。如果没有这样的nib文件,你必须调用-setView:来设置一个self.view。或者重载-loadView 方法


运行顺序:本人已试过:
viewDidLoad ->awakeFromNib ->viewWillAppear
分享到:
评论
2 楼 lingtianlan 2011-11-02  
我实际测试的结果却和你不一样,调用顺序是awakeFromNib -> viewDidLoad,不存在awakeFromNib后viewDidLoad不会被调用的问题。如果用init来初始化且重写了loadView,则表示要用代码来构建controller本身的view,不会去加载nib文件,也自然不会调用awakeFromNib。
请博主再测试一下,以免误导更多人。
1 楼 xserver 2011-07-01  
看了那么十多篇,你写得最好

相关推荐

    loadView和viewdidload

    loadView和viewDidLoad、viewDidUnLoad区别

    IOS 中loadView,viewDidLoad,viewDidUnload详解及使用

    loadView,viewDidLoad,viewDidUnload,这三个函数到底应该怎么用? 搜索一下,全是转载,大概内容是这样: loadView 手动加载view viewDidLoad用于nib文件加载后,进一步处理 viewDidUnload是viewDidLoad的镜像 ...

    initWithCoder与initWithFrame

    每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的. 昨天看了下苹果官方的相关文档...

    构建 View 时可能用到的代理函数调用顺序 viewdidload

    本文将重点介绍`viewDidLoad`与`viewWillAppear`两个关键方法的调用时机及作用,并通过图表形式总结常见的生命周期方法调用顺序,以便于开发者更好地理解和应用。 #### 视图控制器的生命周期 视图控制器是iOS应用...

    详解iOS App开发中UIViewController的loadView方法使用

    本文将深入探讨`loadView`方法的使用及其注意事项。 首先,`loadView`方法的主要作用是在需要时初始化或加载UIViewController的主视图`view`。当尝试访问一个UIViewController实例的`view`属性,且该属性当前为nil...

    iOS学习入门教程附有Demo

    5. 视图控制器的生命周期:与应用类似,UIViewController也有其特定的生命周期,如loadView、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear和viewDidDisappear等方法,这些方法在不同的显示和隐藏...

    移动软件开发-3期(KC015) 简答题.docx

    24. **控制器视图的生命周期**:包括awakeFromNib、loadView、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear等,用于处理视图的加载、显示和消失。 25. **标签页控制器...

    IOS应用源码Demo-一个简单的层管理-毕设学习.zip

    2. **UIViewController的生命周期**:理解一个UIViewController从加载到销毁的过程,包括init、loadView、viewDidLoad、viewWillAppear、viewDidAppear等方法的作用。 3. **Auto Layout**:自动布局系统使得开发者...

    iOS 开发者在面试过程中,常见的一些面试题,建议尽量弄懂了原理,并且多实践.zip

    - UIViewController生命周期,包括init、loadView、viewDidLoad等方法。 - UIView的绘制与动画,如CADisplayLink、Core Animation。 - UI控件的自定义和手势识别,如UIButton、UILabel、UITableView、...

    iOS开发教程之UIView和UIViewController的生命周期详解

    当创建一个UIViewController实例时,我们可以使用`init`,`initWithNibName:bundle:`,或`initWithCoder:`。在代码中,我们同样重写了这些方法来追踪它们的调用顺序。 - `loadView`:这个方法是加载视图的起点。...

    iOS中的View Controller Lifecycle

    - `awakeFromNib`:当 nib 文件加载完成后,此方法会被调用,此时View Controller的所有属性已根据nib文件配置好。 2. **加载视图**: - `loadView`:默认情况下,系统会在此方法中创建并加载`view`属性。你可以...

    一个通用Android的LoadViewHelp

    常见的转圈圈自不必说,但是按照通常的想法,我们往往是加xml里面的view通过隐藏和现实来实现,这种方式实在不太方便,现在实现了一个ViewLoadHelp,直接通过构造构造方法传入待loading的View,方便快捷。...

    UIViewController的加载方式和UIView的加载详解

    - 先检查是否实现了loadView方法并使用返回的视图; - 然后根据是否从storyboard加载来加载视图; - 接着尝试根据XIB文件名加载视图; - 如果没有XIB文件,则尝试寻找类名去除"Controller"后的xib文件,如FirstView....

    自定义AlertView

    这一步可以在`loadView`中完成,也可以在`viewDidLoad`后调用`updateConstraints`。 4. **添加动画**:在`show`和`dismiss`方法中添加显示和隐藏的动画。 ```objc - (void)show { // 添加到父视图,设置初始位置...

    iOS App开发中UIViewController类的使用教程

    通常情况下,你不应重写此方法,而应使用`viewDidLoad`。 4. `viewDidLoad`:视图加载完成后调用,是初始化视图和设置视图属性的最佳时机。在这里,你可以添加子视图、配置控件等。 5. `viewWillAppear:`:视图...

    Viewrrlkalkadsva

    5. **视图卸载**: 如果ViewController是通过 nib 文件创建的,或者在`loadView`方法中调用了`super.loadView`,当收到内存警告并且View不再使用且已经消失时,ViewController会释放View并将指针置为nil,同时调用`...

    UIViewController生命周期详解

    如果`UIViewController`没有设置视图(即`self.view`为`nil`),那么系统会自动调用`loadView`方法。 2. **`viewDidLoad`**:在视图加载完成后会被调用。这是进行额外配置的好时机,比如设置约束、添加子视图等。 ...

    福昕软件招聘iOS开发工程师面试题

    1. UIViewController调用顺序:`initWithNibName:bundle:` -> `loadView` -> `viewDidLoad` -> 使用视图 -> `viewDidUnload` -> `dealloc`。`initWithNibName:bundle:`初始化,`loadView`加载视图,`viewDidLoad`...

Global site tag (gtag.js) - Google Analytics