1.深拷貝與淺拷貝swift
值類型拷貝是一對一的拷貝,每一個引用都有一個不一樣的對象,而引用型拷貝是多對一的拷貝,多個引用指向同一個對象,因此引用類型須要進行內存管理,而值類型不須要數組
//引用類型spa
class Shallow {orm
var copy: Int = 0對象
}內存
//值類型rem
struct Deep {字符串
var copy: Int = 0it
}內存管理
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"