一、视图控制器的生命周期

1 概述

1.1 生命周期的作用

生命周期的主要作用是用来控制视图随时间的变化而变化。生命周期其实就是一系列的系统方法,我们创建的Viewcontroller都是UIViewController的子类,如果我们想知道视图何时发生变化,就需要重写这些方法。

1.2 为什么需要生命周期

因为系统需要对控制器进行初始化,需要知道视图什么时候在屏幕上出现和消失,需要知道边界什么改变。系统需要知道这些消息,这样视图控制的视图才能在iOS环境中正常运行。

2 生命周期方法的使用

1、viewDidLoad 方法

这里很适合放置控制器初始化的代码,你可以看作它是放置init全部内容的地方。viewDidLoad方法在整个生命周期中只会被调用一次。但是有一些操作是不可以在viewDidLoad中执行的,尤其是关于几何的代码,viewDidLoad被调用时,视图的边界还没有定下来,它也许只是待在storyboard里。当它出现在屏幕上时,也许不会出现在预定位置。换句话说,不要在viewDidLoad中添加任何关于视图形状的初始化信息。

2、viewWillAppear

在你的视图控制器的视图就要出现在屏幕上之前,系统会调用viewWillAppear方法。不要在viewWillAppear中添加一次性初始化内容,因为当应用中有多个MVC时,它们会交替出现和消失,所以viewWillAppear会被多次调用。每次视图重新在屏幕上显示时,viewWillAppear都会被再次调用。

如果你需要执行的某些初始化是基于某些数据,而这些数据可能会在视图控制器的视图将要显示在屏幕时发生变化,可以放在viewWillAppear方法中进行操作,所有viewWillAppear适合于对于不可见时可能改变的内容进行同步。

3、viewWillDisappear

这个方法适合于动画执行的结束或者是某些操作的停止,释放某些操作,以减少内存资源的占用。

4、viewDidAppear 和 viewDidDisappear

viewDidAppear会在屏幕出现之后调用。viewDidDisappear会在屏幕消失之后调用。

5、viewWillLayoutSubviews 和 viewDidLayoutSubviews

这两个方法里适合添加与几何相关的代码,布局视图之前会调用viewWillLayoutSubviews方法,比如屏幕从横屏切换到竖屏。布局视图完成之后会调用viewDidLayoutSubviews方法,比如某些东西被手动移动了。

6、didReceiveMemoryWarning

当系统内存不足的时候,视图控制器会收到这条消息。当收到这条内存不足的消息是,我们需要尝试释放一些内存空间。释放堆中的内容,也就是将强指针设为nil。对于屏幕上正在显示一些占内存的东西,我们没有太多处理的办法。但是对于一些不在当前屏幕上的东西如果可以重新创建,就可以先将它设为nil。一般占内存比较大的东西,比如图像、视频、音频这些,其他的一些数据所占的内存很小,就没必须去处理了,否则会使代码变得更复杂。我们为什么需要这样做呢?因为如果iOS认为你大量侵占内存,它可以终止你的应用。如果系统内存不足,而你的应用恰好占用了很多的内存,它就会结束你APP的进程。

7、awakeFromNib

由于某些原因无法放到 viewDidLoad 方法里面执行的,可以放到 awakeFromNib 中来执行。

二、Notifications 通知

三、drawRect

不要自己调用drawRect方法,自己调用是不起作用的,drawRect是由系统来调用的。如果你想重绘视图,就调用setNeedsDisplay。他会告诉系统这个视图需要被重绘,然后系统会在合适的时间调用drawRect方法。