`

loadView和viewDidLoad,即view的生命周期浅析

    博客分类:
  • ios
阅读更多

每个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对象,然后把对象成赋值给viewcontroller的主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 。

分享到:
评论

相关推荐

    loadView和viewdidload

    loadView和viewDidLoad、viewDidUnLoad区别

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

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

    UIView的生命周期

    UIView的生命周期对于理解iOS应用中视图的加载和管理至关重要。在开发iOS应用时,了解UIView及其子类的生命周期方法,可以让开发者合理地安排资源的分配和释放,优化应用的性能,以及提供更好的用户体验。 首先,...

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

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

    UIViewController生命周期详解

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

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

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

    Viewrrlkalkadsva

    ViewController中的View是通过懒加载的方式创建的,即当首次访问`view`属性时,如果View尚未创建,则会触发`loadView`方法来创建View,并随后调用`viewDidLoad`方法完成View的初始化。 2. **视图加载**: `loadView`...

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

    正确理解和使用这个方法可以帮助开发者更好地控制视图的生命周期,提高应用的性能和用户体验。在实际项目中,根据需求适当地重写`loadView`,可以实现自定义视图的加载逻辑,满足复杂界面的构建需求。

    iOS学习入门教程附有Demo

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

    iOS中的View Controller Lifecycle

    在iOS开发中,View Controller(视图控制器)生命周期是开发者必须深入理解的重要概念。View Controller是Apple提供的一个关键组件,用于管理屏幕上的UI元素和用户交互。本文将详细阐述iOS中View Controller生命周期...

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

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

    initWithCoder与initWithFrame

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

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

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

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

    总之,理解并熟练掌握UIViewController的生命周期和属性方法,是成为一名合格的iOS开发者的基础。通过合理利用这些方法,我们可以创建出响应用户交互、高效运行且易于维护的应用程序。在实践中不断探索,你会发现更...

    视图控制器(无动画版).zipIOS应用例子源码下载

    理解这些生命周期方法是掌握视图控制器的关键,例如`awakeFromNib`、`loadView`、`viewDidLoad`、`viewWillAppear`、`viewDidAppear`等。 2. **导航与呈现**:在iOS应用中,我们经常需要在不同的视图控制器之间进行...

    iOS最新面试题及答案(7.29)

    `loadView`适合创建关键视图,但不应调用`self.view`,除非从nib文件加载,此时需要先调用`super.loadView`。`viewDidLoad`是添加附加视图和控件的理想时机,但要注意可能被多次调用。`viewWillAppear`和`...

    视图控制对象的区别及使用

    在iOS开发中,视图(View)是用户界面的基础元素,而视图控制器(ViewController)则是管理和协调这些视图的类。本篇文章将深入探讨视图控制对象的区别以及它们的使用,通过一个小的Demo来帮助大家更好地理解这些...

    05-UI控件1

    最后,我们来看一下控制器View的生命周期。一个控制器的生命周期主要包括以下几个关键步骤: 1. 如果控制器还没有视图,系统会调用loadView来创建视图。开发者可以通过storyboard或代码来配置视图。 2. viewDidLoad...

Global site tag (gtag.js) - Google Analytics