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

2021-07-09 05:39:12 字數 1891 閱讀 9092

在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下記憶體洩露總結

a有個屬性b,b有個屬性a,如果都是strong修飾的話,兩個物件都無法釋放。這種問題常發生於把delegate宣告為strong屬性了。例,inte ce sampleviewcontroller property nonatomic,strong sampleclass sampleclass ...

ARC中的記憶體洩露

arc機制中是否就不存在記憶體洩漏呢,答案是肯定的.有的人也許會說arc中怎麼會存在記憶體洩漏呢,它不是自動管理記憶體嗎?世事無絕對!因為當乙個物件存入到集合中的時候,缺省會儲存它的強指標,如果最後不對這個集合進行清空操作,一樣會有記憶體溢位的情況 person p person alloc ini...

OC記憶體管理之ARC

除了特殊場合,使用arc是大勢所趨。因為這不僅能夠提高程式設計師的開發效率,讓程式設計師把精力專注在功能實現上,也大大節約了專案的開發成本,更提高了程式的可維護性。1.使用arc的重要關注點就是 物件是否有強指標指向,沒有強指標指向的物件會被系統自動 2.property關鍵字 強指標用strong...