自動引用計數
分爲:
自動引用計數概念
引用計數策略
如何解決循環引用
閉包的循環引用
使用的到的關鍵字
weak 弱引用 不會影響引用計數,一般時 optional
unowned 無主引用 不會影響引用計數,一般時 非optional
概念:
在swift中 自動引用計數是實例的被引用次數保存起來,當被引用次數變爲零的時候,就將其釋放的過程。
自動引用計數可以實現自動資源管理的目的
引用計數策略:
1、強引用 (strong reference) ,引用時會導致引用計數 +1 ,失去引用時會使引用計數 -1
2、弱引用 (weak reference) 不會影響引用計數,一般時 optional
3、無主引用 (unowend reference) 不會影響引用計數,一般時 非optional
example:
class Dog {
var name:String
//構造器 初始化
init(name:String){
self.name = name
print("dog \(name) is init")
}
//析構器 釋放
deinit{
print("dog \(name) is denint")
}
}
引用計數
var dog1 : Dog?
var dog2 : Dog?
var dog3 : Dog?
dog1 = Dog(name:"淘氣") //引用計數爲1
dog2 = dog1 //引用計數爲2
dog3 = dog1 //引用計數爲3
輸出
dog 淘氣 is init 現在dog 的引用計數爲3
取消引用計數
dog1 = nil //引用計數爲2
dog2 = nil //引用計數爲1
print("ready nil dog3")
dog3 = nil //引用計數爲0 調用了析構器
輸出
dog 淘氣 is init
ready nil dog3
dog 淘氣 is denint
表示 dog1,dog2 = nil 後 ,dog3 = nil ,實例才被釋放。
解決循環應用
自動引用計數會跟蹤我們所創建的一個實例的引用數量,當引用計數爲0的時候銷燬它,
但是有一種情況使引用計數永遠不能爲0 ----------> 循環的強引用
循環的強引用:
兩個實例相互持有對方的強引用,每個實例都會讓對方一直存在。因爲這2個實例永遠不會釋放,佔有的資源永遠不會釋放掉,就導致了 — 內存泄露
解決循環引用的方法:
1、使用弱引用 關鍵字 weak 在引用對方類的時候 在 前面 加weak
2、使用無主引用 關鍵字 unowend 使用無主引用 注意,類型不能是optional,一定要賦值
example:
class DogName {
var name:String
//持有另一個類
var dogHouse : DogHouse?
init(name:String){
self.name = name
print("dogName \(name) is init")
}
deinit{
print("dogName \(name) is deinit")
}
}