swift ARC中的strong、weak、unowned

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;

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