1. 程式人生 > >swift ARC中的strong、weak、unowned

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;