文章概要:
(1)在這篇文章主要介紹了iOS的強引用與弱引用的差別。
(2)在文章中使用案例介紹強引用與弱引用的使用環境。
(3)通過這篇文章我們能夠更加深入的了解強引用與弱引用的差別。
1.強引用與弱引用的差別。
(1)強應用和弱引用的關鍵字:strong weak
(2)我們都知道strong和weak的差別,但是要仔細看他們的差別到底在哪?
<1>首先我們要知道我們在創建對象的時候如果沒有特別說明的話我們默認的是strong強引用。
<2>強引用會持有對象,而弱引用不持有對象。
<3>代碼示例:

結果如下:

看到結果使我們想起了iOS中的引用計數器,就是說強引用會持用對象,使得每次引用時引用計數器+1,當釋放一次只 是引用計數器減一,所以上圖對象object2不為null. 但是弱引用,引用計數器不會+1,所以上圖例子object3在釋放之后,這個對象引用計數器減為0,所以對象自動釋放了,所以苦逼的弱引用對象object4也為null.
2.強引用與弱引用的使用環境:
注:作為強引用我們最重要的是要注意不能讓他循環引用,否則會照成內存溢出
我們要注意的使用地方有:
(1)使用代理的時候不能使用強引用,我們知道代理對象是由外部銷毀的,而不是由代理控制器本身進行銷毀的。
具體解釋:我們在一個控制器(不一定是控制器,亦可以是View)中設置了代理【我們將這個整體看做對象“object”吧】0.0,當我們在另一個控制器(不一定是控制器)中創建這個對象的時候,在創建的過程中我們相當於對object所有聲明的對象進行了一次強引用,即(我們對object中的代理進行了強引用),當我們聲明代理時這時候就體現出我們weak弱引用的作用了,我們聲明代理由於是弱引用,所以我們的引用計數器並不會+1,所以當我們釋放對象的時候不會出現內存泄漏!

(2)使用block的時候,當我們使用blick代替代理的時候,block內部調用self時候要添加__weak來防止循環
引用照成的內存泄漏。我們使用對象在block在外邊聲明,在block塊內部發生改變時任然在其聲明的時候使用弱引用__weak
(3)其實NSTimer在使用的時候也同樣會照成循環引用,所以我們要釋放NSTimer對象的時候,我們要先調用
[Timer invalidate];方法,在講起對象置為null
3.介紹一下strong和copy的區別


結果:

copy 是將對象值拷貝一份,然后自己創建一個空間放進去,strong是將引用計數器+1,當對象空間的值發生改變時,指向這個空間的對象都會發生改變