1. 程式人生 > >記憶體洩露之自動記憶體管理(ARC)

記憶體洩露之自動記憶體管理(ARC)

一.單個物件的記憶體管理

       在Xcode5.0之前都是手動記憶體管理的,但是在5.0之後就不需要程式猿管理了,為什麼呢?因為Xcode會自動在我們需要釋放的地方加上release,這也是Xcode的一項功能吧.這樣就能免去了我們對程式碼的花太多的時間關心記憶體釋放的問題了,我們就可以專心的提高程式碼實現某一項功能了.在ARC模式下,系統的記憶體到底是怎麼管理的呢?         在ARC的機制下,只要物件沒有被強指標(strong)指向的話,就會釋放.這就是ARC模式下記憶體釋放的主要特性.那麼我們先來看看單個記憶體的管理吧.         方法的實現:
       主函式:

       結果顯示:
       為什麼在ARC模式下,還是能在物件銷燬的時候呼叫delloc方法呢?那物件又是怎麼銷燬的呢?是這樣的:delloc在ARC模式下在物件銷燬的時候也是能夠執行的,只是並不能呼叫[super delloc]方法,所以delloc還是執行了.第二個問題就是由於自動釋放池(@autoreleasepool)的效果,所以當物件出了自動釋放池的範圍,那麼物件就會釋放,也就是說釋放的時候呼叫了delloc.具體的圖我將為大家畫出來.
       為什麼上面標明的是強指標呢?由於只要沒有其它修飾符修飾,只要物件創建出來,預設就是被強指標指向.釋放原因是:由於物件只要出了@autoreleasepool的範圍,那麼物件就會被銷燬,也就是(*car)先銷燬,物件在沒有強指標指向的情況下,也就銷燬了.所以這是單個物件在ARC模式下的記憶體管理.

二.多個物件的記憶體管理

       當一個物件中存在另外一個物件的屬性,也就是說用一個最簡單的例子說明下,就是你有一條狗,而狗也擁有一個主人,那麼就會存在多個指標之間的指向關係.我們先來看程式碼吧.

        上面兩段程式碼就是在強指標下的程式碼.

       由於是強指標指向的原因,delloc並不會呼叫,也就是說物件並沒有釋放.我們來看圖:
       看上面的圖片可以知道,由於dog指標和person指標在物件創建出來的時候是強指標指向Dog和Person物件,那麼什麼時候釋放呢?在物件出了@autoreleasepool的範圍的時候dog和person指標就釋放了,但是由於Dog物件和PPerson物件分別有strong指標互相指向,那麼這裡就出問題了,就造成Dog和Person物件無法釋放了,也就是不能呼叫delloc方法了.那麼怎麼才能達到釋放的效果呢?我們先從程式碼入手,然後再分析系統框圖. 圖一:

圖二:
        只要將Person或者Dog中的strong改為weak就好,但是這裡不推薦兩個都改為weak,因為如果是這樣的話,指標太弱了,不安全.最好是strong和weak連用.下面是改完之後的結果.
     上面所說的方法也能改善迴圈引用問題.這就是在ARC模式下的記憶體洩露以及管理的問題和方法,如果有什麼issue,請給我留言,我們一起交流.謝謝!!!!!