ios开发获取父控制器生命周期_iOS - ViewController的生命周期

本文介绍了iOS中ViewController的生命周期,包括展示内容的ViewController和控制显示的ViewController两大类。详细阐述了ViewController与View的生命周期关系,以及在不同阶段如init、loadView、viewDidLoad、viewWillAppear、viewDidAppear、viewDidUnload等调用的时机和适宜的代码编写位置。特别强调了在不同生命周期函数中初始化视图和数据的注意事项。
摘要由CSDN通过智能技术生成

iOS SDK中提供很多原生的ViewController,大大提高了我们的开发效率;那么下面我们就根据开发中我们常用的ViewController谈一谈它的生命周期;

(一)按照结构和用法可以对iOS的所有ViewController分成两类:

1、主要用于展示内容的ViewController;如UITableViewController,UIViewController,这种ViewController主要为用户展示应用的内容,并提供与用户交互。

2、用于控制和显示其他ViewController的ViewController;如UINavigationController,UITabbarController,这种ViewController一般都是ViewController的容器或者控制器;他们都有一个属性viewControllers(其中:①UINavigationController表示一种Stack式结构,push一个ViewController或者pop一次ViewController,所以一般后一个ViewController一般都会依赖前一个ViewController;②而UITabbarController表示一个Array式结构,各个ViewController之间是并列的)。

(二)Controller和View的生命周期:

这里指的View是指Controller的View;它作为Controler的属性,生命周期在Controller的生命周期内;也就是说你的Controller不能在view释放前就释放了。

image

图--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生命周期中有那么多函数,那么代码该写在那个函数里面更好呢:

1、init里不要出现创建view的代码;在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据;init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的);

2、loadView中只初始化view;一般用于创建比较关键的view如tableViewController的 tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用 super的loadView方法,但建议不要重载这个方法;

3、viewDidLoad 这时候view已经有了;最适合创建一些附加的view和控件了,有一点需要注意的是,viewDidLoad会调用多次(viewcontroller可能多次载入view);

4、viewWillAppear 这个一般在view被添加到superview之前;切换动画之前调用,在这里可以进行一些显示前的处理,比如键盘弹出,一些特殊的过程动画;

5、viewDidAppear 一般用于显示后;在切换动画后,如果有需要的操作,可以在这里加入相关代码;

6、viewDidUnload 这时候viewController的view已经是nil了;由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在 viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成 nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值