iOS——UIViewController

一、概述

1. UIViewController 对象是 iOS 开发中最重要的核心类之一,它在 MVC 中扮演的就是 Controller
2. 每一个 UIViewController 对象都有一个 view 属性,UIViewController 对象管理的就是这个 view 属性所指的视图对象

二、属性

1. 加载 view 属性所指的视图对象

1)xib 加载,使用如下的方法,指定 xib 文件名和 xib 文件所在的包名

- (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 的生命周期

相关方法的执行顺序 :
  init (初始化) -> loadView (加载视图) -> viewDidLoad (视图已经加载好) -> viewWillAppear (视图将要显示) -> viewWillLayoutSubviews (将要布局子视图) -> viewDidLayoutSubviews (已经布局子视图) -> viewDidAppear (视图已经显示) -> viewWillDisappera (视图将要消失) -> viewDidDisappear (视图已经消失) -> viewWillUnload (将要销毁视图,iOS6中已废弃) -> viewDidUnload (已经销毁视图,iOS6中已废弃) -> dealloc (释放内存)

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 方法中完成










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值