iOS strong weak unowned引用

灰s發表於2017-12-22

公司的2.0已經拿Swift全部重寫了一遍,原本以為自己對Swift的基礎瞭解應該是足夠了,看來我還是想多了,當程式設計師確實是一個很有挑戰性的工作。

這篇文章主要寫一下ARC相關的知識

1. Strong

原來我還以為Strong沒什麼好寫的,後來我發現我對強引用迴圈的理解有點偏差。

image.png

這樣一個強引用迴圈。john持有的apartment屬性強引用了unit4Aunit4A持有的tenant屬性強引用了john。 這裡分兩種情況:

  • jhon或者unit4A設定成nil,或者兩者都設定成nil,並不能消除這個強引用迴圈。也就是會造成記憶體洩漏。
  • jhonapartment或者unit4Atenant設定成nil,則可以取消掉這個強引用迴圈。

2. Weak和Unowned

二者的具體使用方法我這裡就不寫了,可以參考文章在最後給的連結。這裡我主要是記錄一下二者的區別。

  • 關於兩者使用的選擇,Apple 給我們的建議是如果能夠確定在訪問時不會已被釋放的話,儘量使用unowned,如果存在被釋放的可能,那就選擇用weak
  • 也就是說unowned不可為nilweak可以為nil

3. 使用選擇

  • 兩個屬性的值都允許為nil,並會潛在的產生迴圈強引用。這種場景最適合用弱引用來解決。
  • 一個屬性的值允許為nil,而另一個屬性的值不允許為nil,並會潛在的產生迴圈強引用。這種場景最適合通過無主引用來解決。
  • 兩個屬性的值都不允許為nil,並會潛在的產生迴圈強引用。這種場景需要一個類使用無主屬性,而另外一個類使用隱式解析可選屬性。(隱式可選屬性也就是宣告屬性的時候,在型別後面加上!,比如: var p: Person!

參考連結:

Swift中的ARC

相關文章