一、概述
二、属性
1. 加载 view 属性所指的视图对象
- (instancetype)initWithNibName:(nullableNSString *)nibNameOrNil bundle:(nullableNSBundle *)nibBundleOrNil;
在创建一个和 UIViewController 同名的 xib 文件时,将 File's Owner 的 class 设置为对应的 UIViewController,然后将 File's Owner 中的 view 属性和与 xib 文件中自己创建的视图关联起来;然后再使用上述方法,如下
self.window.rootViewController = [[LHRootViewController alloc]initWithNibName:@"LHRootViewController" bundle:[NSBundle mainBundle]];
self.window.rootViewController = [[LHRootViewController alloc]init];
是因为 initWithNibName:bundle: 方法是 UIViewController 对象的指定初始化方法,向 UIViewController 对象发送 init 方法时,会自动调用 initWithNibName:bundle: 方法,并为两个参数传入 nil,尽管传入的值是 nil,但 UIViewController 对象还是会从应用程序包中查找和当前 UIViewController 同名的 xib 文件,所以,仍然会加载 LHRootViewController.xib 文件
2)代码加载
UIViewController 对象在创建时会自动从其 xib 或 storyboard 文件中加载视图,如果没有找到,则 view 为 nil;此时,可以重写 loadView 方法来使用代码的方式加载视图
2. UIViewController 的生命周期
UIViewController 对象的生命周期包括 : 初始化对象、加载视图、销毁视图、释放对象
1)初始化方法;初始化 UIViewController 对象时调用
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullableNSBundle *)nibBundleOrNil;
- (instancetype)init
2)当 UIViewController 对象的 view 需要被显示时,而它却是 nil 时,如果重写了该方法就调用
如果重写了该方法,那么 xib 和 storyboard 都无效
- (void)loadView;
3)执行完 loadView 后执行该方法,执行 viewDidLoad 时 view 属性已经创建好了
此方法执行时,UIViewController 对象已经创建好,outlet 也已经连接好了,但是 view 还没在屏幕上显示
view 加载完时,可以做一些数据的初始化工作在此方法中
不变的东西,始终要在屏幕上显示的东西放在此方法中
- (void)viewDidLoad;
4)当 view 视图将要显示到屏幕上时调用,可以重复调用
和几何相关的,放在此方法中
- (void)viewWillAppear:(BOOL)animated;
5)当 view 将要从屏幕上消失时调用
- (void)viewWillDisappear:(BOOL)animated;
6)当 view 视图已经在屏幕上显示时调用
- (void)viewDidAppear:(BOOL)animated;
7)当 view 视图已经从屏幕上消失时调用
- (void)viewDidDisappear:(BOOL)animated;
8)此方法用来布局 view 视图中的子视图,一般在这个方法中设置子视图的 frame,当控件本身的 frame 发生变化时,系统会自动调用此方法
该方法被调用的情况 :
a. addSubview: 会触发
b. 设置 view 的 frame 并且 frame 有变化时会触发
c. 滚动 UIScrollView 时会触发
d. 旋转屏幕会触发
e. 改变一个 UIView 对象的大小时会触发其父视图上的 layoutSubviews
- (void)viewWillLayoutSubviews;
9)当执行完 viewWillLayoutSubviews 方法时执行此方法
- (void)viewDidLayoutSubviews;
10)内存警告
a. iPhone 下的每个 app 可用的内存都是有限制的,一般为 20MB;如果一个 app 所用的内存超过 20MB,那么系统会向该 app 发送 Memory Warning 消息,此时,必须释放一些不必要的内存;如果一个 app 所用的内存超过 30MB,系统会关闭该 app
b. 通常一个 app 会包含很多的 viewController,当一个 viewController 跳转到另一个 viewController 时,前一个 viewController 并没有被释放掉,而是保存在内存中的,以便下次能够快速显示,但是当 app 收到 Memory Warning 消息时,必须将当前不可见的 viewController 释放掉,以便内存充足;
c. iOS5 的处理
在 iOS6之前,如果一个 app 收到内存警告消息,当前不可见的 viewController 会收到 viewDidUnload 消息,所以要在 viewDidUnload 方法中释放掉所哟的 outlet;当前可见的 viewController 通过 didReceiveMemoryWarning 方法释放资源
d. iOS6 的处理
在 iOS6 之后,废弃了 viewDidUnload 方法,所以,一切释放内存的工作都要在 didReceiveMemoryWarning 方法中完成