swift基礎之自動引用計數

自動引用計數

分爲:

自動引用計數概念

引用計數策略

如何解決循環引用

閉包的循環引用


使用的到的關鍵字

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      //引用計數爲調用了析構器

 輸出

 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")

    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章