開發者所創造物件使用與否,都會佔用部分的記憶體,這時候我們可以做到的事情,就是管理好物件與物件之間的關聯,這些關聯會決定物件生命期的長短,在我們用不到物件時去釋放物件所佔據的記憶體。
每次實例化一個新的Class時,ARC都會分配記憶體去儲存這個實例的資訊。記憶體資訊包含實例的類型,還有跟這實例相關聯的Property。
此外,當實例不再被需要時,ARC會釋放該實例的記憶體,這記憶體會做其他目的的使用。確保class的實例不被需要時,不會佔用記憶體空間。
如果ARC要釋放一個仍在使用的實例,將不再進入該實例的屬性,或是使用實例的Method。但是,如果還是要進入這個實例的話,app或許會crash。
確保實例在需要時不會消失,ARC會追蹤每個Property、常數及變數的數量。只要還有一個實例存在ARC就不會釋放記憶體
為了做到這點,無論何時你訪問一個Class的property, constant, or variable,這些property, constant, or variable都會強引用這個實例。之所以叫做"強引用",因為它將這個實例保持住,只要這個強引用還在,就不允許它被解除分配。
當一個 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死亡時,記憶體就釋放其記憶體空間。