1、结构函数
按结构能够对iOS的全部ViewController分红两类:动画
一、主要用于展现内容的ViewController,这种ViewController主要用于为用户展现内容,并与用户交互,如UITableViewController,UIViewController。设计
二、用于控制和显示其余ViewController的ViewController。这种ViewController通常都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,所以后一个ViewController通常会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。code
第一种ViewController会常常被继承,用来显示不一样的数据给用户。而第二种不多被继承,除非你真的须要自定义它。继承
注:细心的同窗应该能发现,在Xcode中新建一个ViewController时,只能够选择继承自UIViewController和UITableViewController,而它们都是第一种。生命周期
2、Controller和View的生命周期内存
这里指的View是指Controller的View。它做为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。get
ViewController生命周期it
ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。io
一、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时会从新建立。