iOS SDK中提供不少原生的ViewController,大大提升了咱们的开发效率;那么下面咱们就根据开发中咱们经常使用的ViewController谈一谈它的生命周期;网络
(一)按照结构和用法能够对iOS的全部ViewController分红两类:app
一、主要用于展现内容的ViewController;如UITableViewController,UIViewController,这种ViewController主要为用户展现应用的内容,并提供与用户交互。函数
二、用于控制和显示其余ViewController的ViewController;如UINavigationController,UITabbarController,这种ViewController通常都是ViewController的容器或者控制器;他们都有一个属性viewControllers(其中:①UINavigationController表示一种Stack式结构,push一个ViewController或者pop一次ViewController,因此通常后一个ViewController通常都会依赖前一个ViewController;②而UITabbarController表示一个Array式结构,各个ViewController之间是并列的)。动画
(二)Controller和View的生命周期:spa
这里指的View是指Controller的View;它做为Controler的属性,生命周期在Controller的生命周期内;也就是说你的Controller不能在view释放前就释放了。blog
图--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);
四、viewWillAppear 这个通常在view被添加到superview以前;切换动画以前调用,在这里能够进行一些显示前的处理,好比键盘弹出,一些特殊的过程动画;
五、viewDidAppear 通常用于显示后;在切换动画后,若是有须要的操做,能够在这里加入相关代码;
六、viewDidUnload 这时候viewController的view已是nil了;因为这通常发生在内存警告时,因此在这里你应该将那些不在显示的view释放了。好比你在 viewcontroller的view上加了一个label,并且这个label是viewcontroller的属性,那么你要把这个属性设置成 nil,以避免占用没必要要的内存,而这个label在viewDidLoad时会从新建立。
(以上即是对ViewController生命周期的相关介绍和理解,还但愿你们相互补充共同进步)