1、值类型/引用类型
-
在 Swift 语言中,所有的类型都可以被分为 “值类型” 或者 “引用类型”,可以将其理解为函数参数传递的方式。
- 值类型表示的是将它传递给一个方法的时候,使用的是复制;将它赋值给另一个变量的时候也是如此。修改得到复制的时,修改的也仅仅是复制的值,而不是原来的那份。
- 引用类型存储在堆中,即使是一个常量指针,也会导致引用计数增加。当把一个常量指针所指向的对象传递给一个方法时,传递的是这个对象的指针。如果这个方法修改了这个对象,那么它修改的就是存储在堆中的那个对象。
从程序的角度来看,值类型和引用类型是相对的一个概念。其中的差别就在于:对新的对象产生赋值等指向性的操作之后,再次操作赋值对象或被赋值对象是否会同步于另外一个对象。
-
在 Swift 语言中,大多数类型都是值类型的,但是也有一些特殊情况,比如可以在函数参数定义中使用
inout
关键字将参数定义为引用类型。// a,b 都是引用类型
func swapT<T>(inout a:T, inout b:T)
2、值类型/引用类型数据结构
-
Swift 中的数据结构主要由以下三大类构成:类(Class)、结构体(Structure)和枚举(Enumeration)。
- 三类数据结构中,结构体和枚举传递存储的是复制后的值,属于值类型。
- 类传递的是对象的指针,属于引用类型。
-
和其它很多面向对象语言一样,类的对象存储在堆(Heap)中,类的指针保存在栈(Stack)中。
- 堆中的对象系统会自动为我们管理(ARC),这样就不用我们去开辟和释放内存空间了。
- 一旦没有指针指向对象,那么对象马上会被清理掉,这种机制叫做自动引用计数。
定长的结构体和枚举是直接保存在栈上的,变长的结构体和枚举需要堆内存的配合。栈的空间有限,运行速度更快。