一、视图控制器的生命周期
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方法。