iOS - ViewController的生命周期

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生命周期的相关介绍和理解,还但愿你们相互补充共同进步)

相关文章
相关标签/搜索