以 弱引用 避免保留環 (死循環)
對象圖里面經常出現一種情況,就是幾個對象都以某種方式互相引用,從而形成'環', 由于 OC 內存管理模型使用引用計數架構, 所以這種情況通常會泄漏內存, 因為左后沒有別的東西會引用環中的對象,這樣的話, 環里的對象就無法為外界所訪問了, 但是對象之間尚有引用, 這些引用是的他們都能繼續存下去,而不會為系統所回收.
最簡單的保留環 由兩個對象構成,他們互相引用對方, 這種保留環產生的原因不難理解, 而且很容易就能通過代碼偵察出來.
避免保留環的最佳方式 就是弱引用, 這種引用經常用表示 '非擁有關系',將屬性聲明為 unsafe_unretained 即可,屬性特質 unsafe_unretained 一詞表明,屬性值可能不安全,而且不歸此實例所擁有,如果系統已經把屬性所指的那個對象回收了, 那么在其上調用方法可能會導致應用程序崩潰. 由于本對象并不保留屬性對象, 因此其有可能為系統所回收.
用 unsafe_unretained 修飾的屬性特質,其語義同 assign 特質等價, 然而,assign 通常只用于 '整體類型' (int,float,結構體等), unsafe_unretained 則多用于對象類型, 這個詞本身就表示其所修飾的屬性可能是無法安全使用的.
OC 還有一項與 ARC 相伴的運行期特性, 可以領開發者安全使用的弱引用, 這就是 weak 屬性特質, 他與 unsafe_unretained 的作用完全是等價的, 然而,只要系統吧屬性回收,屬性值就會自動設為 nil,
當指向屬性實例的引用移除后, unsafe_unretained 屬性仍然指向那個已經移除的實例, weak 屬性則指向 nil.
一般來說,使用weak 比使用 unsafe_unreatained 更加安全.
如果不擁有某個對象,那就不要保留它.
總結: 將某些引用設為 weak. 可以避免出現 '保留環' (死循環);
weak 引用可以自動清空, 也可以不自動清空,自動清空是隨著 ARC 而引入的新特性,由運行期系統來實現, 在具備自動清空功能的弱引用上, 可以隨意讀取其數據, 因為這種引用不會指向已經回收過的數據