原创Blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list
我的stackoverflow
前言:Swift相对应Objective C来说,它不再需要绝大部分对象继承自NSObject
,所以Swift的类型和Objective C的变量类型也不一致。
Value Type/Reference Type
什么是值类型,引用类型?
二者最主要的差别在于当copy发生的时候,注意,当在Swift中使用赋值符号的时候发生的都是copy,这个在最后我会解释为什么。
Struct是值类型
struct S{
var num = -1
}
var a = S()
var b = a
a.num = 10
print(b.num) //-1
可以看到,值类型拷贝后的内存是这个样子的
再来看看引用类型
class S{
var num = -1
}
var a = S()
var b = a
a.num = 10
print(b.num) // 10
总结
值类型或者引用类型在赋值的时候都是Copy,值类型拷贝累实际的内存(value),而饮用类型只是拷贝了指针,仍然指向最开始的内存区域
什么是值类型or 引用类型?
- Class的实例是引用类型
- Swift方法类型是引用类型(在Swift中,方法也是一种类型)
- 其余的都是值类型,像Array,Dictionary本质都是Struct。
值类型的优点
优点还是很明显的,每次得到的都是一个Copy,这样就可以放心的运行,没必要担心其他代码修改这个值。尤其是在多线程环境里。
值类型每次都会进行Copy吗?
并不是每次都是要copy的,当值并不会改变的时候,Swift并不会进行copy。例如
let a = 1;let b = a
.
什么时候用值类型/引用类型?
用值类型
- 当你希望用
==
来比较的时候 - 赋值后有独立的状态
- 数据在多线程中使用
引用类型
- 当你希望用
===
来比较的时候(注意,这里三个等号) - 创建共享的可变数据
Copy/MutableCopy
对于不可变类型,举例NSString
代码
let str1 = NSString(string: