IOS开发笔记_2.UIViewController生命周期

接触IOS开发一个多月了,开发用的比较多的就是ViewController,今天整理复习了一下这方面的知识,对这个东东有了更进一步的了解。

ViewController属于MVC模式当中的C,他是View的Controller,主要用于管理内部各个View的加载显示和卸载,和负责与其他ViewController的通信和协调。

 

两类ViewController

一类是显示内容的,例如:UIViewController,UITableViewController等,以及自定义继承自UIViewController的ViewController。

另一类是ViewController容器,UINavigationViewController和UITabBarController等,UINavigationController是以Stack的形式来存储和管理ViewController,UITabBarController是以Array的形式来管理ViewController

 

View的加载过程

 

首先访问view属性,如果view存在,则直接加载。如果不存在,则调用loadView方法。

loadView方法执行操作如下:

如果你覆盖了loadView方法,则必须创建view给UIVIewController的view属性,如果你没有覆盖方法,UIViewController会默认调用父类的方法加载初始化view

从图中可以看到,在view加载过程中首先会调用loadView方法,在这个方法中主要完成一些关键view的初始化工作。然后就是加载View,加载成功后接着调用viewDidLoad方法。有一个很重要的地方就是,在loadView之前,view是不存在的,也就是说view还没有被初始化,直到完成viewDidLoad方法后,ViewController里面就成功的加载view了。

创建View的方式

首先看一下创建的文件,一个RootViewController和view.xib文件。

 

1.代码创建

    //代码创建1
    RootViewController *rootViewController = [[RootViewController alloc]init];
    rootViewController.view.backgroundColor = [UIColor redColor];
    self.window.rootViewController = rootViewController;
    [rootViewController release];

 

2.指定xib文件创建

 //XIB文件创建2
    RootViewController *rootViewController = [[RootViewController alloc]     initWithNibName:@"View" bundle:nil];
    self.window.rootViewController = rootViewController;

 

3.如果不指定XIB文件,则初始化的时候默认加载与viewController同名的xib文件。

 RootViewController *rootViewController = [[RootViewController alloc] init];
    self.window.rootViewController = rootViewController;

这里有一点要注意的就是在XIB文件中,要确认XIB属于的类。还有View代理必须拖到view视图中

  

 

避免在viewDidLoad中调用还没有初始化的视图,因为会出现死循环,看一下官方的文档

 

意思就是当调用getter方法,并且view的值是nil的时候,会调用self.loadView方法。在viewDidLoad调用self.view时候,假如视图的值还是为nil,那么会调用loadView方法,加载完成后又调用viewDidLoad方法,这样的话就一直循环

 

ViewController中的view卸载

当系统发出内存警告时,会调用didReceiveMemoeryWarning方法,如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view,完成后调用viewDidUnload方法,至此,view就被卸载了。此时原本指向view的变量要被置为nil,具体操作是在viewDidUnload方法中调用.

总结:

 

loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil。

 

ViewController的生命周期中各方法执行流程如下:

init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc

 

标签