iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 21
0
自我挑戰組

Swift!從新手到微上手系列 第 21

Swift-ARC自動引數計數(Automatic Reference Counting)

  • ARC 如其名 “AutoMatic Reference Counting” 是自動化管理記憶體,所以開發者不用多花心力去處裡記憶體。

開發者所創造物件使用與否,都會佔用部分的記憶體,這時候我們可以做到的事情,就是管理好物件與物件之間的關聯,這些關聯會決定物件生命期的長短,在我們用不到物件時去釋放物件所佔據的記憶體。

ARC如何運作

每次實例化一個新的Class時,ARC都會分配記憶體去儲存這個實例的資訊。記憶體資訊包含實例的類型,還有跟這實例相關聯的Property。

此外,當實例不再被需要時,ARC會釋放該實例的記憶體,這記憶體會做其他目的的使用。確保class的實例不被需要時,不會佔用記憶體空間。

如果ARC要釋放一個仍在使用的實例,將不再進入該實例的屬性,或是使用實例的Method。但是,如果還是要進入這個實例的話,app或許會crash。

確保實例在需要時不會消失,ARC會追蹤每個Property、常數及變數的數量。只要還有一個實例存在ARC就不會釋放記憶體

為了做到這點,無論何時你訪問一個Class的property, constant, or variable,這些property, constant, or variable都會強引用這個實例。之所以叫做"強引用",因為它將這個實例保持住,只要這個強引用還在,就不允許它被解除分配。

ARC in Action

當一個 class 實體被指派值時 ( 變數、常數或屬性 ),會建立這個實體的強參考(strong reference),並將參考計數(reference count 加1),強參考會將這個實體保留住,而只要強參考還在(參考計數不為0),記憶體就不會被釋放掉:

class Computer {
    var computerId: String
    init(id: String){
        self.computerId = id
        print("\(computerId) is initializer")
    }
    deinit{
        print("\(computerId) is deinitializer")
    }
}

var tomComputer: Computer? = Computer(computerId: "Tom's Computer")
//印出 "Tom's Computer is initializer"

tomComputer = nil
//印出 "Tom's Computer in deinitializer"

當 classComputer被被創造(初始化)時,記憶體會分配一個空間給它,參考計數加1;而當Computer被丟掉(反初始化)時,執行deinit並釋放記憶體空間,參考計數為0。

維持一個class物件的生命就是靠其 Reference count,Reference count是指這個物件所指到的property數量,在這個例子Computer的 Reference count 就是 1,當物件死亡時,代表將沒有東西指到這些Property,所以系統會把這些Property所佔的空間釋放出來。
當tomComputer被創造(初始化)時,記憶體會分配一個空間儲存他,當tomComputer死亡時,記憶體就釋放其記憶體空間。


上一篇
Swift-Protocol
下一篇
ARC自動引數計數(Automatic Reference Counting) (2)
系列文
Swift!從新手到微上手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言