1.深拷贝与浅拷贝

值类型拷贝是一对一的拷贝,每个引用都有一个不同的对象,而引用型拷贝是多对一的拷贝,多个引用指向同一个对象,所以引用类型需要进行内存管理,而值类型不需要

//引用类型
class Shallow {
var copy: Int = 0

}
//值类型
struct Deep {
var copy: Int = 0
}
var s1 = Shallow()
var s2 = s1//引用类型,拷贝的是同一块内存地址,浅拷贝
var d1 = Deep()
var d2 = d1//值类型,另外分配内存,两个不同的地址,深拷贝
d1.copy = 9
print(d1.copy)
print(d2.copy)//d1值改变不影响d2
s1.copy = 9
print(s1.copy)
print(s2.copy)//s1,s2都是相同地址,同一个对象,值都改变

2.在swift,字符串拷贝是深拷贝,因为它是值类型,但是在oc中,foundation类库中的字符串是引用类型,它的拷贝是浅拷贝

3.集合类型的拷贝

在swift里集合是值类型的,所以是深拷贝,但是集合内元素有其他类型的,情况就比较复杂了,在oc里集合是class类型的,所以是浅拷贝

4.深入集合类型的拷贝操作

struct d {
var copy: Int = 0

}
class c {
var copy:Int = 0
}
var d1 = d()
var d2 = d()
var c1 = c()
var c2 = c()
var darray = [d1,d2]//包含两个值类型元素的数组
var carray = [c1,c2]//包含两个类类型元素的数组
var darray1 = darray//深拷贝
var carray1 = carray//浅拷贝
//改变某一数组的大小,不会影响到另外一个数组
//darray1.removeLast()
//print(darray1.count)
//print(darray.count)
//将一数组中的某个元素值改变,也不会影响另外一个数组
//darray1[0] = d(copy: 3)
//print(darray[0].copy)
//print(darray1[0].copy)
//数组中元素是值类型,则是深拷贝,是引用类型的则是浅拷贝。
5.隐式强引用

class Student {
var name: String
init(name:  String){
self.name = name

}
func show(){
print("name=\(name)")
}
deinit{
print("\(name)deinit")
}
}
var s1: Student? = Student(name: "tom")
var s2 = s1//s1,s2都显示强引用了同一个对象
s1 = nil
s2 = nil//将s1,s2都置空,系统会将对象销毁
//隐式强引用(简介强引用)

var sarray = [Student(name: "huahua"),Student(name: "kite")]//间接强引用,对象加入到数组中后,对象如果是引用类型,那么数组会强引用该对象。数组让该对象的引用计数加一,当某个对象不再属于数组时,改对象的引用计数会减一,数组本身被销毁的时候,它包含的该对象不再属于它,如果对象是引用类型,它的引用计数将会减一。

sarray[0].name = "john"