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

简介: 本话来讲解一下控制器的Lifecycle(生命周期)。 我们谈到的控制器的生命周期时,其实是在关注这个控制器在生命周期中接收到的一系列消息,这些消息伴随着整个的生命周期。

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


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

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

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


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

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

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

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


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

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

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


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

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


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

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


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

下一个要讲到的是awakeFromNib


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



目录
相关文章
|
前端开发 API
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记4 MVC enum Tuple Dictionary
 回顾一下我们上一话中的代码: @IBAction func operate(sender: UIButton) { let operation = sender.
791 0
|
前端开发 iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
   继续上一话中的计算器Demo,上一话讲到类必须被初始化,类中的属性也必须被初始化,所以你不能只声明而不给它一个处置,那么问题来了,我们从storyboard中拖拽的@IBOutlet为什么只有声明而不需要初始化呢,这是因为它的类型依旧是一个optional,在你初始化之前已经被赋值为nil了,这也就是为什么你不需要再初始化它的原因。
873 0
|
Unix iOS开发
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
  首先感谢网易公开课和SwiftV课堂的朋友们辛苦翻译,这个系列是我学习斯坦福IOS8公开课的个人心得体会和笔记,希望能给大家带来启发。
1062 0
|
19天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
6天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
10天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
12天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
15天前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
20天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
23 2
|
27天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
45 9