-
ViewController解析
UIViewController是iOS顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放。
UIView与UIWindow共同展示了应用程序的用户界面。可以将UIView理解成画布,UIWindow理解成画框。这两个类的继承关系是这样的:
NSObject — UIResponder — UIView — UIWindow (UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow)
iOS中,所有显示在界面上的对象都是从UIResponder直接或间接继承的,UIView和UIWindow也不例外。
可以将它们之间的关系想象成这样一个场景:首先会有一个空的画框(UIWindow),我们在画框上放置一块画布(UIView),然后可以在这个画布(UIView)上进行绘画,画布上可能会被画上各种元素,例如UILabel、UIButton等。这些元素其实也是一个又一个UIView,它们会有一个层级关系管理,有点相当于Photoshop图层的概念,层级高的元素会覆盖住层级低的元素,从而导致层级低的元素被部分或完全遮挡。
-
ViewController分类
iOS的ViewController可分为两类:
- 主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
- 用于控制和显示其他ViewController的ViewController。这种ViewController一般都是一个ViewController的容器。如UINavigationController,UITabbarController。它们都有一个属性:viewControllers。其中UINavigationController是一种Stack式结构,push进一个ViewController或pop出一个ViewController,因此后一个ViewController一般会依赖前一个ViewController。而UITabbarController表示一个Array结构,各个ViewController是并列的。
第一种ViewController会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。
在Xcode中新建一个ViewController时,只可以选择继承自UIViewController和UITableViewController,而它们都是第一种。
-
ViewController代码执行流程
当一个视图控制器被创建时,代码的执行顺序
1、alloc 创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView 从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear 视图已在屏幕上渲染完成
当一个视图被移除屏幕并且销毁的时候的执行顺序
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
如下图:
-
说明:
1. 当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit(懒加载)方式创建.
2. 当你调用的view属性的getter方法:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。
3. loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view以及创建好了。
4. 当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
5. 当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。
6. 当view不在使用,而且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。