15.4 Swift深入分析集合类型的拷贝操作

// 结构体 ,值类型的赋值操作是深拷贝

struct Deep {

var copy: Int = 0

}

// 类,引用类型 的赋值操作是浅拷贝

class Shallow {

var copy: Int = 0

}

var de0 = Deep.init()

var de1 = Deep.init()

// 数组元素都是值类型

var dearray = [de0,de1]

var sh0 = Shallow.init()

var sh1 = Shallow.init()

// 数组元素都是引用类型

var sharray = [sh0,sh1]

/**

深拷贝,这个地方是两个引用指向两个不同的对象。

因此,我们说值类型 的拷贝它的内存管理非常简单,不需要用ARC什么的来进行处理。

引用类型的内存管理用 ARC

*/

var dearray1 = dearray

var sharray1 = sharray


// dearray1.removeLast()

dearray1[0] = Deep.init(copy: 22)

print("dearray1.count == \(dearray1.count)")

print("dearray.count == \(dearray.count)")

print("dearray1[0].copy==\(dearray1[0].copy)")

print("dearray[0].copy==\(dearray[0].copy)")

/**

dearray1.count == 1

dearray.count == 2

dearray1.count == 2

dearray1[0].copy==22

dearray[0].copy==0


当将dearray1数组中的某个元素替换,或者改变了数组的大小,不会影响另外一个数组dearray

1)根据被拷贝的数组大小来创建一个新的数组对象,新的容量跟原始数组大小相同。

2)将原始数组中的每一个元素依次拷贝到新的数组对象中。

*/

dearray1[0].copy = 88

print("dearray1[0].copy==\(dearray1[0].copy)")

print("dearray[0].copy==\(dearray[0].copy)")

/**

dearray1[0].copy==88

修改副本 属性copy,还是不会影响到原始版本中 copy的值。

*/

sharray1[0].copy = 99

print("sharray1[0].copy==\(sharray1[0].copy)")

print("sharray[0].copy==\(sharray[0].copy)")

/**

sharray1[0].copy==99

sharray[0].copy==99

这个元素的内容修改时,也改变了原始版本中元素的内容

这个数组Array 是深拷贝。

但是数组中的对象是值类型,修改数组中的对象属性,不会修改到另一个版本。

数组中对象是引用类型,修改数组中的对象属性,还是会修改到另一个版本

*/

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...