Swift ARC 自动引用计数

引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0,此时系统会自动释放实例所占用的内存空间,一旦释放就不能再访问这个实例的属性和方法。

Swift 栈和堆

Swift 中的数据类型分为引用类型(类)和值类型(枚举、结构体)。引用类型存储在 “堆” 上,值类型存储在 “栈” 上。Swift 管理引用类型采用自动引用计数(ARC)的管理方法。值类型是由处理器来管理的,不需要程序员来管理。

Swift 类型桥接

iOS 中的 API 基本都是在许多年前由 OC 写成的,现在通过桥接的方法在 Swift 中可以用,基本看不出区别,非常自然。但是一些特殊的类型,在两种语言进行桥接的时候需要特别注意。

Swift Precondition 预处理

precondition 和 assert 的格式类似,也是动态的,precondition 会造成程序的提前终止并抛出错误信息。precondition 在一般的代码中并不多见,因为它是动态的,只会在程序运行时进行检查,适用于哪些无法在编译期确定的风险情况。

Swift Assert 断言

对每次运行都会出现的错误通常不会过于苦恼,可以使用断点调试或者 `try catch` 之类的方式判断并修复它。但是一些偶发(甚至是无数次运行才会出现一次)的错误单靠断点之类的方式是很难排除掉的,为此,引入一个不是很常用的调试工具函数 `assert`。在实际编码中,为了保证程序正常运行,只有在某些必要条件被满足的情况下才执行特定代码段,这种编程思想叫做 “防错性编程”。

Swift Defer 延迟调用

在一些语言中,有 `try/finally` 这样的控制语句,比如 Java。这种语句可以让我们在 `finally` 代码块中执行必须要执行的代码,不管之前怎样的兴风作浪。在 Swift 2.0 中,Apple 提供了 `defer` 关键字,让我们可以实现同样的效果。

Swift Guard 守护

guard` 语句和 `if` 语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么。`guard` 语句的作用顾名思义就是守护。`guard` 语句判断其后的表达式布尔值为 `false` 时,才会执行之后代码块里的代码,如果为 `true`,则跳过整个 `guard` 语句。

Swift 异常处理

在 Swift 2.0 中 Apple 提供了使用 `throws`、`throw`、`try`、`do`、`catch` 这五个关键字组成的异常控制处理机制。在 Swift 1.0 时代是没有异常处理和抛出机制的。

Swift SingleClass 单例类

单例对象能够被整个程序所操作。对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到。

Swift 柯里化

由于柯里化在业务层的应用较少,所以从 Swift 3.0 开始移除了柯里化的用法,但是 Swift 的很多底层特性是使用柯里化来表达的。