首先咱们来了解一下什么是viewController。viewController叫作视图控制器。对内是用于管理视图,对外则是与其余的viewcontroller进行通讯。它继承于NSObject。它分为两种类型,一种叫contentViewController,内容视图控制器,主要用于体现内容,如UITableView UIViewController这种直接显示内容的;还有一种叫作containerViewController,容器视图类。典型的就是tabBar,和navigation.它还包含好几个其它的viewController.xcode
每一个view都有一个viewController。且view的生命周期也在viewController里面。因此在view释放以前,viewcontroller是不能够释放的。那viewController的生命周期究竟是怎么样的呢?和我一步一步来看吧。app
step1:initWithNib viewController 会进行alloc,并init.wordpress
step2: loadView 在这里会看它的子类是否有重写这个函数,若是重写了则调用子类的,不然就调用她本身的。注意,这个时 候视图仍是没有没加载进来的哦。函数
step3:viewDidLoad 这个时候视图已经存在了。能够在这里添加你想要添加的UI控件了。动画
step4:viewWillAppear 视图将出如今屏幕上了spa
step5:viewDidAppear 视图已经成功在屏幕上渲染完成了.net
step6:viewWillDisappear 视图将要消失了设计
step7:viewDidDisappear 视图从屏幕上消失了code
step8:viewDidUnLoad 当发生内存警告的时候,若是本视图不是当前正在显示的视图,则会执行这个函数。将子视图释放。blog
step9:dealloc 释放viewController
而view的生命周期则是step3_step8.
origin:http://blog.163.com/daisy_20100129/blog/static/20140225620121118104522986/
iOS的SDK中提供不少原生ViewController,大大提升了咱们的开发效率,下面是个人一些经验。
按结构能够对iOS的全部ViewController分红两类:
一、主要用于展现内容的ViewController,这种ViewController主要用于为用户展现内容,并与用户交互,如UITableViewController,UIViewController。
二、用于控制和显示其余ViewController的ViewController。这种ViewController通常都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,所以后一个ViewController通常会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。
第一种ViewController会常常被继承,用来显示不一样的数据给用户。而第二种不多被继承,除非你真的须要自定义它。
注:细心的同窗应该能发现,在Xcode中新建一个ViewController时,只能够选择继承自UIViewController和UITableViewController,而它们都是第一种。
这里指的View是指Controller的View。它做为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。
图2 ViewController生命周期
当你alloc并init了一个ViewController时,这个ViewController应该是尚未建立view的。ViewController的view是使用了lazyInit方式建立,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否建立,若是没有建立,那么会调用loadView来建立view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时尚未view。而viewDidLoad时view以及建立好了。
当view被添加其余view中以前时,会调用viewWillAppear,而以后会调用viewDidAppear。
当view从其余view中移出以前时,会调用viewWillDisAppear,而以后会调用viewDidDisappear。
当view不在使用,并且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。
ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。
一、init里不要出现建立view的代码。良好的设计,在init里应该只有相关数据的初始化,并且这些数据都是比较关键的数据。init里不要掉self.view,不然会致使viewcontroller建立view。(由于view是lazyinit的)。
二、loadView中只初始化view,通常用于建立比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。若是你是从nib文件中建立的viewController在这里必定要首先调用super的loadView方法,但建议不要重载这个方法。
三、viewDidLoad 这时候view已经有了,最适合建立一些附加的view和控件了。有一点须要注意的是,viewDidLoad会调用屡次(viewcontroller可能屡次载入view,参见图2)。
四、viewWillAppear 这个通常在view被添加到superview以前,切换动画以前调用。在这里能够进行一些显示前的处理。好比键盘弹出,一些特殊的过程动画(好比状态条和navigationbar颜色)。
五、viewDidAppear 通常用于显示后,在切换动画后,若是有须要的操做,能够在这里加入相关代码。
六、viewDidUnload 这时候viewController的view已是nil了。因为这通常发生在内存警告时,因此在这里你应该将那些不在显示的view释放了。好比你在viewcontroller的view上加了一个label,并且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以避免占用没必要要的内存,而这个label在viewDidLoad时会从新建立。
origin:http://blog.csdn.net/qijianli/article/details/7826979
最后其实在
[[UINavigationController alloc]initWithRootViewController:(Your ViewContrlloer)];
[self.navController pushViewController:(Your ViewContrlloer) animated:YES];
都会按顺序调用上面的方法