1.內存管理安全
a。內存管理的對象--只針對引用類型的對象classspa
b。內存管理的原則:當沒有任何引用指向某個對象的時候,系統會自動銷燬該對象orm
c。arc自動引用計數對象
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所指向的對象當即被系統銷燬(弱引用的特性),可是系統不會像給可選類型變量那樣賦值爲nil,unownedRef不是可選類型,他依然指向被銷燬的對象,接下來的其餘執行命令都會出現錯誤
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?