Swift 提供了兩種辦法用來解決你在使用類的屬性時所遇到的循環強引用問題:弱引用(weak reference)和無主引用(unowned reference)。
弱引用和無主引用允許循環引用中的一個實例引用而另外一個實例不保持強引用。這樣實例能夠互相引用而不產生循環強引用。
當其他的實例有更短的生命周期時,使用弱引用,也就是說,當其他實例析構在先時。
相比之下,當其他實例有相同的或者更長生命周期時,請使用無主引用
弱引用
弱引用不會對其引用的實例保持強引用,因而不會阻止 ARC 銷毀被引用的實例。這個特性阻止了引用變為循環強引用。聲明屬性或者變量時,在前面加上weak關鍵字表明這是一個弱引用。
因為弱引用不會保持所引用的實例,即使引用存在,實例也有可能被銷毀。因此,ARC 會在引用的實例被銷毀后自動將其賦值為nil。并且因為弱引用可以允許它們的值在運行時被賦值為nil,所以它們會被定義為可選類型變量,而不是常量。
你可以像其他可選值一樣,檢查弱引用的值是否存在,你將永遠不會訪問已銷毀的實例的引用。
注意
當 ARC 設置弱引用為nil時,屬性觀察不會被觸發。
ARC 中,一旦值的最后一個強引用被移除,就會被立即銷毀
無主引用
和弱引用類似,無主引用不會牢牢保持住引用的實例。和弱引用不同的是,無主引用在其他實例有相同或者更長的生命周期時使用。你可以在聲明屬性或者變量時,在前面加上關鍵字unowned表示這是一個無主引用。
無主引用通常都被期望擁有值。不過 ARC 無法在實例被銷毀后將無主引用設為nil,因為非可選類型的變量不允許被賦值為nil。
重要
使用無主引用,你必須確保引用始終指向一個未銷毀的實例。
如果你試圖在實例被銷毀后,訪問該實例的無主引用,會觸發運行時錯誤。