`
啸笑天
  • 浏览: 3475408 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

loadView和viewDidLoad及initWithNibName/awakeFromNib/initWithCoder

 
阅读更多

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

一、loadView 

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

这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。

所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。

如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。

这个网上的资料都说的很不全面,尤其是蓝色字部分。 
二、viewDidLoad 

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

网上资料对这个函数的描述则完全不对。 
三、viewDidUnload 

这个函数是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时有回到第一步 

如此循环 

    需要厘清两个概念,创建一个类和实例化一个类.在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会被调用.

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

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

分享到:
评论
1 楼 啸笑天 2014-04-01  
当程序对Nib文件进行反序列化然后初始化时,会调用一次awakeFromNib。
但是如果你使用initWithNibName调入Nib时,awakeFromNib是不会被调用的。

相关推荐

    loadView和viewdidload

    loadView和viewDidLoad、viewDidUnLoad区别

    initWithCoder与initWithFrame

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

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

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

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

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

    MBSimpleLoadingIndicator:iOS应用程序的易于使用,高度可定制的加载指示器

    _loadview = [[MBLoadingIndicator alloc ] init ]; // Start the loader [ self .loadview start ]; // Add the loader to our view [ self .view addSubview: self .loadview]; 用法 ###更改百分比 // ...

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

    需要注意的是,`loadView`和`viewDidLoad`只会在视图首次加载时执行一次。如果在`view`为nil时再次访问`view`属性,系统不会再次调用`loadView`,而是直接返回已创建的视图。 在实际开发中,你可能会遇到这样的情况...

    iPhone开发【二】重写HelloWorld (不使用XIB)

    创建项目后,我们会看到一个默认的`ViewController.m`文件,其中包含一个简单的`loadView`方法,该方法已经在代码中初始化了一个UILabel来显示"Hello, World!"。我们可以修改这个方法,以不依赖XIB文件: ```...

    UIViewController生命周期详解

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

    iOS学习入门教程附有Demo

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

    SwiftUI嵌入UIKit(UIKit回传值到SwiftUI)

    SwiftUI是苹果在2019年推出的一种全新的界面构建框架,它为iOS、macOS、watchOS和tvOS提供了声明式编程的方式来设计用户界面。然而,在实际开发中,我们可能会遇到需要与传统UIKit组件交互的情况,比如利用UIKit的...

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

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

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

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

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

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

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

    如果控制器是通过代码直接创建的,例如`[[YFViewController alloc]init]`,生命周期顺序将是`-initWithNibName:bundle:` -> `-init` -> `-loadView` -> `-viewDidLoad` -> `-viewDidAppear:`。如果控制器是从XIB或...

    视图控制器与导航模式-源码ppt

    1. UIViewController的生命周期:包括`awakeFromNib`、`init`、`loadView`、`viewDidLoad`、`viewWillAppear`、`viewDidAppear`、`viewWillDisappear`和`viewDidDisappear`等方法的使用场景和调用顺序。 2. 自定义...

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

    2. `init` 和 `initWithCoder:`:分别用于代码创建和从 nib 文件或故事板加载实例时的初始化。前者适用于手动创建对象,后者适用于从序列化数据恢复。 3. `loadView`:此方法默认由系统调用,用于加载视图。若...

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

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

    iOS中的View Controller Lifecycle

    - `initWithNibName:bundle:`:当从故事板或 nib 文件加载View Controller时,此方法被调用,传入 nib 文件名和资源包。 - `awakeFromNib`:当 nib 文件加载完成后,此方法会被调用,此时View Controller的所有...

Global site tag (gtag.js) - Google Analytics