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 是深拷贝。 但是数组中的对象是值类型,修改数组中的对象属性,不会修改到另一个版本。 数组中对象是引用类型,修改数组中的对象属性,还是会修改到另一个版本 */ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |