在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型。
闭包和函数同属引用类型
捕获则为拷贝。捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值
class属于引用类型。
Array的情况稍微复杂一些,下面主要对集合类型进行分析:
一、关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会发生拷贝。
如果字典实例中存储的keys和Value是值类型,当赋值或调用发生时,他们都会被拷贝。
如果keys和Value中存储的是引用类型,再拷贝时,拷贝的也是引用,而不是引用对应的类实例或函数。
二、关于Array:
因为Array能提供接近C语言的性能,并且拷贝行为只会在必要的时候才会发生。
通常情况下,将一个数组赋值给一个常量或变量的时候,传递的是引用,而不是拷贝的副本。
只有在以下情况下才会发生值拷贝:数组的长度大小有可能被改变时,及对数组进行插入,增加,删除或者使用范围下标去替换这一范围内的元素时,才会引起数组的值拷贝。
当拷贝发生时,其拷贝方式,与字典的拷贝方式相同。
注意:当使用下标语法,修改数组的内容时,不会引起数组的拷贝。因为下标语法并不会引起数组长度的改变,改变的只是数组的内容。
当操作一个数组时,或将其传递给函数以及方法调用时,很有必要确定这个数组是一个唯一的拷贝。
特别是当一个数组被多个变量引用时,只需要对一个变量,进行unshare操作,即可保证此变量为次数组的一个独立拷贝。
unshare与copy的区别:
unshare被调用时,仅在确有必要时才会创建数组的拷贝
copy属于强制拷贝,会在任何时候都创建一个新的拷贝,即使引用已经是一个唯一引用。
所以,如果仅需要保证你对数组的引用是唯一引用,请调用unshare方法,而不是copy方法
swift学习笔记(三)关于拷贝和引用,布布扣,bubuko.com