// 结构体 ,值类型的赋值操作是深拷贝
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 是深拷贝。
但是数组中的对象是值类型,修改数组中的对象属性,不会修改到另一个版本。
数组中对象是引用类型,修改数组中的对象属性,还是会修改到另一个版本
*/
原文链接:https://www.f2er.com/swift/322358.html