循環(huán)引用這種方式雖然很簡單歧胁,但是有一個比較大的瑕疵,就是不能很好的解決循環(huán)引用的問題桶现。
什么會造成循環(huán)引用問題呢?
比如說A和B兩個對象鼎姊,相互引用了對方作為自己的成員變量骡和。只有當自己銷毀的時候才能將成員變量的引用計數(shù)-1。但是因為A對象的銷毀又依賴于B對象相寇,B對象銷毀又依賴于A對象慰于。這樣就造成了循環(huán)引用的問題。英文稱之為Reference Cycle唤衫。在外界這兩個對象已經(jīng)沒有任何對象能夠訪問到了婆赠,而且也不能被釋放。
解決循環(huán)引用問題的方法:
1.第一種就是我們清楚地知道這里有循環(huán)引用佳励,在合理的位置(根據(jù)業(yè)務的具體邏輯)主動斷開循環(huán)中的一個引用休里,使得對象得以回收。
主動斷開循環(huán)引用這種常見于各種block相關的代碼邏輯中
2.使用弱引用
弱引用雖然持有對象赃承,但是并不增加引用計數(shù)妙黍,這樣就避免了循環(huán)引用的產(chǎn)生,在iOS開發(fā)中瞧剖,弱引用通常在delegate模式中使用拭嫁,舉個例子來說吧,兩個ViewController, A和B抓于,viewControllerA需要彈出ViewControllerB做粤,讓用戶輸入一些內容,當用戶輸入完成之后捉撮,ViewControllerB需要返回給ViewControllerA怕品,這個時候viewController的delegate對象通常是一個弱引用,以避免兩個ViewController相互引用對方造成循環(huán)引用的問題
弱引用的實現(xiàn)原理:
弱引用的實現(xiàn)原理呕缭,系統(tǒng)對于每一個有弱引用的對象堵泽,都維護一個表來記錄它所有的若引用的指針地址。這樣恢总,當一個對象的引用計數(shù)為0的時候迎罗,系統(tǒng)就通過這張表,找到所以的弱引用指針片仿,繼而將他們都設置成為nil
使用Xcode檢測循環(huán)引用
Xcode中的instrument工具可以很方便的檢測循環(huán)引用纹安。
在Xcode的菜單欄選擇:Product ->Profile,然后選擇Leaks,在點擊右下角的Profile按鈕就可以開始檢測。
-------------------引自唐巧