Swift 用自動引用計數ARC(Automatic Reference Counting)方式來跟蹤和管理app的內存使用。這使得內存管理成爲swift內部的機制,不需要認爲考慮。ARC會自動釋放那些不再被需要的變量。
ARC如何工作
每次創建一個類的新實例時,ARC會分配一大塊內存來存儲有關該實例的信息。該內存將保存有關實例類型的信息,以及與該實例關聯的任何存儲屬性的值。
另外,當不再需要實例時,ARC會釋放該實例使用的內存,以便將內存用於其他目的。這樣可以確保類實例在不再需要時不佔用內存空間。
但是,如果ARC要釋放仍在使用的實例,那麼將無法再訪問該實例的屬性,或者調用該實例的方法。實際上,如果您嘗試訪問該實例,那麼您的應用程序很可能會崩潰。
爲了確保實例在仍然需要時不會消失,ARC跟蹤當前引用每個類實例的屬性,常量和變量。只要至少對該實例的一個活動引用仍然存在,ARC將不會釋放實例。
爲了實現這一點,只要將類實例分配給屬性,常量或變量,該屬性,常量或變量就可以強制引用該實例。這個引用被稱爲“強”引用,因爲它保持了對該實例的堅定的約束,並且不允許它被解除分配,只要這種強烈的參考依然存在。
1、strong(強引用): 聲明一個屬性時,default默認爲strong。
當變量設置爲nil時,不會調用deinitializer函數。強大的參考循環可以防止該實例被釋放,造成應用程序中的內存泄漏。
var defaultValue: Int = 7
//默認defaultValut爲強引用類型
2、weak(弱引用):
弱引用是對所引用的實例不會保持強制的引用,因此不會阻止ARC處理引用的實例。可以通過將weak關鍵字放在屬性或變量聲明之前來指示弱引用。
因爲一個弱引用並沒有對它引用的實例保持強烈的控制,所以這個實例可能被解除分配,而弱引用仍然是指它。因此,當引用的實例被釋放時,ARC會自動將弱引用設置爲nil。而且,由於弱引用需要在運行時將其值更改爲nil,所以它們總是被聲明爲可選類型(Optional)的變量而不是常量。
class Apartment {
let unit: String
init(unit: String) {
self.unit = unit
}
weak var tenant: Person?
//將tenant設爲nil的時候,tenant將會被釋放。
deinit { print("Apartment \(unit) is being deinitialized") }
}
3、unowned(未知引用):
一個未知的參考預計總是有一個價值。因此,ARC從未將未知引用的值設置爲nil,這意味着使用非選擇類型定義未知引用。
僅當您確定引用始終是指向未釋放的實例時,才使用未知引用。如果您嘗試在該實例被釋放後訪問unowned的值,那麼您將收到運行時錯誤。
舉個例子,客戶與信用卡之間的關係,客戶可能有也可能沒有信用卡,但信用卡將始終與客戶相關聯。 CreditCard實例永遠不會超過它所指的客戶。爲了表示這一點,客戶(Customer)類有一個optional卡屬性,但CreditCard類有一個unowned客戶屬性。
由於信用卡將始終擁有客戶,因此將其客戶資產定義爲unowned引用,以避免強引用!
Overall:
簡單理解就是
strong爲nil也不會被釋放;
weak爲nil會被釋放;
unowned不能爲nil;