swift的一些重要概念值与引用值与引用类型在某些情况下与我们的编程习惯可能会有些冲突,是swift初学常遇到的一个坑。先看一个例子,定义两个数组arr1和arr2,arr2用arr1赋值:修改arr2[0]后,发现arr1[0]并没有修改。由此可知在swift中,array类型是值类型。再来看看array的实现方式。按住command键点击array类型,进入到swift库,可以看到如下定义:array和dictionary,包括int、set、double等基本内建数据类型都是由struct及其实现的一组协议构成。由于struct类型是值类型,所以swift中的基本内建类型都是值类型。由于是值类型,所以每次赋值或者传参的时候都会有个拷贝的过程。我们先来做个实验:运行以上代码可以发现,在修改了arr[0]的情况下,赋值的时间是1783ms(模拟器下),而仅是读取的情况,赋值时间是0ms。这个结果说明值传递使用了写时拷贝(copy on write)技术,也就是说只要不修改存储的数据,副本和原值共享内存区域。因此我们在使用这些值类型的时候一般有一些原则:尽量限制数据规模;如果数据规模较大,尽量不用作赋值和传参;如果需要赋值和传参,尽量定义为常量或后续不修改数据;如果以上都不能避免,可以使用引用类型代替值类型,如 nsmutablearray等; 20210311