第十三篇:ARC自動引用計數器原理

1.指針分2種:

》強指針:默認情況下,所有的指針都是強指針 __strong。

》弱指針:__weak。說明:當一個弱指針指向一個創建出來的對象,而之後沒有強指針指向該對象,那麼該對象會在內存中被釋放,弱指針被賦值成空 nil 。

   代碼表現形式:

      Dog * p1 = [ [Dog alloc] init ] ; // p1 爲強指針,指向新創建出來的對象,引用計數器 = 1

      __weak Dog * p2 = p1; // p1所指向的對象的引用計數器不會+1,引用計數器還是 = 1

     p1 = [ [Dog alloc] init ] ;  // p1又指向了新的對象,這行代碼之後,舊對象就會在內存中被釋放且p2 = nil ,因爲該對象沒有強指針指向它。如果這行代碼換成 p1 = nil ; 效果一樣.


2.ARC判斷準則: 只要沒有強指針 指向 堆內存中的對象 ,該對象的內存就會被自動翻譯。


3.ARC特點:

》不請允許調用release , retain , retainCount .

》允許重寫dealloc對象方法,但是不 允許調用 [super dealloc] ;

》@property 參數:

         》strong : 成員變量是強指針,適用於OC對象。@propery (nonatomic , strong) Dog * dog; //表示dog對象指針是 強 指針類型。

         》weak  :  成員變量是弱指針,適用於OC對象。@propery (nonatomic , weak) Dog * dog; //表示dog對象指針是 弱 指針類型。

》以前的retain 改爲用 strong,也就是 有多少個強指針 指向 創建出來的 對象,那麼該對象的引用計數器等於幾。


4.自動管理內存(ARC)的互引用:

》問題:strong 對象的指針 出現了循環互引用。這樣就會導致在一個相互指向的循環圈內的對象內存不能被釋放,出現內存泄漏問題。

》解決:一端用strong 類型指針,一端用weak類型指針。只要沒有出現 強指針類型的對象 循環指向就可以解決該問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章