公司的2.0已經拿Swift全部重寫了一遍,原本以為自己對Swift的基礎瞭解應該是足夠了,看來我還是想多了,當程式設計師確實是一個很有挑戰性的工作。
這篇文章主要寫一下ARC相關的知識
1. Strong
原來我還以為Strong沒什麼好寫的,後來我發現我對強引用迴圈的理解有點偏差。
這樣一個強引用迴圈。john
持有的apartment
屬性強引用了unit4A
,unit4A
持有的tenant
屬性強引用了john
。
這裡分兩種情況:
- 將
jhon
或者unit4A
設定成nil
,或者兩者都設定成nil
,並不能消除這個強引用迴圈。也就是會造成記憶體洩漏。 - 將
jhon
的apartment
或者unit4A
的tenant
設定成nil
,則可以取消掉這個強引用迴圈。
2. Weak和Unowned
二者的具體使用方法我這裡就不寫了,可以參考文章在最後給的連結。這裡我主要是記錄一下二者的區別。
- 關於兩者使用的選擇,Apple 給我們的建議是如果能夠確定在訪問時不會已被釋放的話,儘量使用
unowned
,如果存在被釋放的可能,那就選擇用weak
。 - 也就是說
unowned
不可為nil
,weak
可以為nil
。
3. 使用選擇
- 兩個屬性的值都允許為
nil
,並會潛在的產生迴圈強引用。這種場景最適合用弱引用來解決。 - 一個屬性的值允許為
nil
,而另一個屬性的值不允許為nil
,並會潛在的產生迴圈強引用。這種場景最適合通過無主引用來解決。 - 兩個屬性的值都不允許為
nil
,並會潛在的產生迴圈強引用。這種場景需要一個類使用無主屬性,而另外一個類使用隱式解析可選屬性。(隱式可選屬性也就是宣告屬性的時候,在型別後面加上!
,比如:var p: Person!
)
參考連結: