昨天介紹完 ARC 和 Retain Cycle,今天來說一下要如何處理 Retain Cycle。
要處理 Retain Cycle 的方法也很簡單,那就是一開始就不要讓他形成一個循環,在一開始就讓 ARC 不要去計算它的連結,這裡就會用到兩個關鍵字:unowned 和 weak。
首先要來介紹的是 unowned,unowned 跟 weak 的最大差別是,假設現在一個屬性是 unowned 的,那麼這個屬性所指向的東西也必須要存在,而 weak 沒有這些限制。
這裡是一個會產生 Retain Cycle 的情況,可以看到就算我們將兩個變數都設成 nil 了,依然沒有東西被釋放。
為了處理這個情況,這裡看一下 class 的內容,Order 裡的 orderer 產生的時候會指向 Member,所以可以在前面加上 unowned 關鍵字,讓 ARC 不要去計算那邊的連結。
現在再執行一次,可以發現這次都成功釋放了。
那介紹了 unowned,接下來換介紹 weak,weak 相比 unowned 更加隨意。
基本上可以這麼說,如果不清楚當下該用什麼樣的關鍵字 weak 是最安全的選擇。
這裡可以看到就算我將 unowned 改成 weak,依舊能成功被釋放。
這樣大概介紹完兩個關鍵字之後,可以發現 weak 是最安全的選擇,但是他的感覺比較像是在說:
我不一定會產生連結,就算有我也不想管理
而 unowned 就是在說:
我需要這個連結,但是我不想管理他。
這兩個關鍵字還是有一些細微的差別的,當然可以都使用 weak,但是 unowened 在使用上比較嚴謹,可以協助開發者在管理記憶體時更清楚哪些資料造成了問題,方便後續去維護、修改。
那今天就到這裡,明天就開始來介紹 Property Wrapper。