【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

本话来讲解一下控制器的Lifecycle(生命周期)。

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

我们谈到的控制器的生命周期时,其实是在关注这个控制器在生命周期中接收到的一系列消息,这些消息伴随着整个的生命周期。为什么我们要关注生命周期?这是因为我们经常在子类中复写方法,以期望这些方法在某些特定的时刻发生作用。

生命周期由创建一个控制器开始,大部分时候我们是通过storyboard初始化的,通过Identifier segue到一个MVC也会创建一个控制器。

初始化之后会发生什么事情呢?如果你被segue到这个控制器的话,那么你会get prepared(做好准备),然后你的outlet会被初始化,之后可能会频繁地出现或者消失,甚至因为旋转屏幕而改变控制器的位置。当系统内存低的时候会让我们解决这些内存中的控制器等等各种问题。

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

当segue的准备和outlet被初始化之后,我们的视图开始被载入。这个时候会调用一个方法viewDidLoad,这个方法中非常适合放置你初始化你的视图的代码,因为一切都已就绪。如果你复写了viewDidLoad,第一件事是调用父类的方法:super.viewDidLoad。而且在控制器生命周期相关的方法中,你始终希望调用super的相应方法。

通常你在viewDidLoad中常做的一件事就是更新你的用户界面。之前我们说过一旦你的模型发生了改变,你会在模型的属性观察器中更新用户界面,你应该继续去做这个操作,因为你的控制器已经被载入而且显示在屏幕上了,有些人改变了模型你必须去更新你的用户界面。但是当你刚创建了一个控制器的时候,你同样需要更新你的用户界面。那是因为你的模型中的属性观察器并不会在outlet设置之前真正去更新你的用户界面。

注意你的控制器的边界会在晚一些的时候才会被设置。

下一个在生命周期中被调用的方法是viewWillAppear。当你的控制器马上要显示到屏幕上的时候才会出现。

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

viewWillAppear有一个参数这个参数表示这个控制器的出现是否带有动画效果,通常你不用关心这个参数,那么什么时候需要参数呢?比如你在导航控制器中通过segue新生成一个MVC,那么这个新MVC的控制器是滑动到我们视野中的,这就是动画。viewWillAppear在生命周期中可以被多次调用,因为你的控制器能显示在屏幕上也可以从屏幕上消失。例如分栏控制器,你打开ipad在竖屏模式是看不到master的你需要滑动显示master,当你旋转到横屏的时候就能看到master了,所以每一次master显示在屏幕上的时候,viewWillAppear都会被调用。当你调用viewWillAppear方法的时候你的视图的边界已经被设置好了。

此外还有一个viewDidAppear方法。当你已经显示在屏幕上的时候,才会调用viewDidAppear。与这两个方法相对,当控制器将要消失的时候,有方法ViewWillDisappear和ViewDidAppear。

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

接下来讲一下Geometry(几何位置),当你的视图几何位置改变时,系统会自动重新布局,因为你已经设置好了Auto Layout属性。

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

你可以在代码中捕获到这种视图边界的变化,当你顶层的子视图发生变化时,系统会调用viewWillLayoutSbuviews方法和viewDidLayoutSubviews方法,这两个方法经常被调用。

AutoLayout在这两个方法中间被调用。来看下下一个概念Autorotation(自动旋转):

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

到目前为止,我们在App中编写的代码,根本没有考虑过Autorotation,它自动发生,当我们的边界改变的时候。当我们的屏幕发生旋转的时候,边界是变宽了还是变窄了,然后你可以参照这个过程做一些事情。你可以到你的项目中取消特定的方向旋转,默认取消的是颠倒的竖屏。如果你想要编写屏幕旋转时的动画效果,你可以通过viewWillTransitionToSize。

现在还记得当系统内存不足的问题么,现在来解决这个问题:

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

我们之前讲过对象都在内存的堆中存储,当内存空间不足时,你可能会想办法从内存中移除某些类,此时指向这些类的指针也会被移除,它们变成了nil。清理内存首选那些占用系统资源多的内容,比如图片或者声音,我们把它们的指针全部设为nil,那么它们会被ARC所处理掉以节省空间。

下一个要讲到的是awakeFromNib

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期

它严格来说并不在控制器的生命周期中,它是任何从storyboard中生成的对象都有的方法。下面来展示一下完整的生命周期:

【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记25 Lifecycle生命周期


上一篇:nginx反向代理、负载均衡、页面缓存、url重写详解


下一篇:新零售行业搜索最佳实践