15--swift以內存管理

1.內存管理安全

a。內存管理的對象--只針對引用類型的對象classspa

b。內存管理的原則:當沒有任何引用指向某個對象的時候,系統會自動銷燬該對象orm

carc自動引用計數對象

class MemArc {生命週期

deinit{內存

print("deinit")it

}內存管理

}class

var r = MemArc()test

var r1 = r

var r2 = MemArc()


r = r2

r1 = r2//r,r1,r2都指向了一個對象,因此第一個實例化的對象就會被系統自動銷燬,系統會調用deinit

2.weak引用

//strong引用,就是默認的引用方式

class REf {

deinit{

print("deinit")

}

func test(){

print("test")

}

}

weak var weakRef = REf()//當對象指向弱引用,系統會自動將對象銷燬,會調用deinit,並賦值爲nil


var strongRef = REf()//默認的引用方式就是強引用,引用計數自動加一

weak var weakRef1: REf? = REf()//弱引用是一個可選類型

//對可選類型的調用不能強制解包,只能隱式解包

//weakRef1!.test()強制解包會出錯

//隱式解包

if let wr = weakRef1{

wr.test()

}

//weak引用不會影響程序的生命週期,生命週期只取決於強引用,因此weak引用引用計數不會加一

3.unowned

class REf {

deinit{

print("deinit")

}

func test(){

print("test")

}

}

unowned var unownedRef: REf = REf()//也是弱引用,無主引用,weak不一樣的是,它修飾的不是可選類型,因此沒有weak安全,由於此條語句執行完後,unownedRef所指向的對象當即被系統銷燬(弱引用的特性),可是系統不會像給可選類型變量那樣賦值爲nilunownedRef不是可選類型,他依然指向被銷燬的對象,接下來的其餘執行命令都會出現錯誤

unownedRef.test()//會出錯

4.weak解決循環強引用問題

arc不是萬能的,它能夠很好的解決內存過早釋放的問題,可是在某些場合下不能很好的解決內存泄漏的問題

循環強引用是:對方類互相持有對方

class Person {

let name: String

init(name: String){

self.name = name


}

var apartment: Apartment?

deinit{

print("\(name)is being deinitialized")

}

}

class Apartment {

let number: Int

init(number: Int){

self.number = number

}

var tenant: Person?

deinit{

print("Apartment#\(number)is being deinitialized")

}

}

var john: Person?

var number32: Apartment?

john = Person(name: "john sheldon")//強引用

number32 = Apartment(number: 502)//強引用

john!.apartment = number32//相互持有對方類屬性

number32!.tenant = john

john = nil

number32 = nil//都指向nil,系統應該銷燬,deinit應該被調用,可是沒有被調用,事實上,兩個對象沒有被銷燬,咱們沒有辦法在訪問他們了,致使內存泄漏。

//如何解決。能夠將某一個類可選屬性設置爲weak引用,如weak var tenant: Person?

相關文章
相關標籤/搜索