16--swift以內存管理進階

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"

相關文章
相關標籤/搜索