記憶體洩露之手動記憶體管理 MRC

2021-07-09 05:16:05 字數 2082 閱讀 5978

由於移動裝置的記憶體是有限的,如果建立的物件用完不及時的銷毀(釋放)的話,就會造成記憶體洩露.如果該物件的記憶體空間釋放了,但是依舊在使用的話,那麼就是殭屍物件.同時指向殭屍物件的指標就是野指標.對於記憶體管理的原則是,不用的物件就要**其所占用的空間,防止造成記憶體洩露.並且我們要知道,記憶體洩露主要是針對堆區的物件.其它的區域並不存在記憶體的洩露.

下面我將為大家一次的說明單個物件和多個物件,怎麼處理記憶體洩露的問題.

單個記憶體洩露情況1:

為什麼會造成這樣的原因呢?就是因為建立物件後沒有release,就造成了記憶體的洩露.怎麼解決呢?我們來看下面的**吧.

建立完後,如果不用就直接release就可以了.這是單個記憶體洩露的第一種情況.

單個記憶體洩露情況2:沒有遵守記憶體管理的原則.

沒有遵守記憶體的管理原則:誰建立,誰release;誰retain,誰release;誰引用,誰release.所以會造成記憶體的洩露,那麼怎麼解決呢?

直接在release一次就可以了,這是第二種情況.

單個記憶體洩露情況3:不當的使用了nil,造成了記憶體洩露.

為什麼?是在物件建立過後,直接將nil賦值給了指向物件的指標,也就是指標dog的值一直是0,那麼後面的一系列的**所代表的都是0在run和0在release.解決的辦法,就是不能在物件建立後,直接給物件賦值nil.

然後就是第四種記憶體洩露了:用物件作為引數傳給另外乙個物件或者在內部不當的使用了retain,也會造成記憶體洩露.

上面的情況就造成了記憶體洩露,下面就是解決辦法.

上面所有的**,只要當記憶體完全釋放的時候就會呼叫delloc.

上面所有的都是有關單個記憶體的洩露問題.

首先我們要知道為什麼多個物件會有記憶體洩露問題呢?比如,我們可以假設乙個人和一輛車,然後人開車去某個地方,最後是車在跑,最後車到達目的地了,然後建立的物件並沒有釋放,造成了記憶體的洩露.那麼我就拿人開車去某個地方來說明記憶體洩露的問題.

這是car的(.m)檔案:

然後就是人的(.m)檔案:

那麼我們來看看main的部分:

最後執行的結果是人到達餓目的地.但是這裡就有問題了,車的delloc和人得delloc並沒有執行,那麼就造成了記憶體的洩露了.那麼怎麼解決呢?

結果顯示人的delloc和車的dello都執行了,那麼又有問題了,那樣做是不是很不方便呢?我們能不能用乙個方法直接封裝起來呢,這樣就算外部在怎麼的訪問都是一樣的,就不需要考慮野指標的問題了,那麼怎麼解決呢?我們來看看下面的解決**(這種方法主要是針對建立多個物件的問題).

上訴所寫得**是在set方法裡面直接控制,也是核心.管理原則是:如果乙個類中,有其他類的物件(關聯關係),set方法書寫的時候,要判斷是否是同乙個物件,release舊的值,retain新的值.這是對多個物件的手動管理方法.

圖一:圖二:

圖三:

ios之手動記憶體管理

在建立物件的時候,回生成retaincount變數,alloc,new,retain都會使這個值 1,對應的release方法則會使這個值 1。當retaincount 0時系統會呼叫dealloc方法使系統銷毀改物件。所以我們在使用手動記憶體管理時,要注意一下問題 1.原則 記憶體管理原則 配對原...

iOS之手動記憶體管理

objective c採用了一種被稱為引用計數 reference counting 的機制來追蹤物件狀態,每個物件都有乙個與之關聯的整數,被稱為引用計數器。當乙個物件的引用計數為0時,表明程式不再需要該物件,物件會被銷毀。若是物件還持有其他物件的引用,必須重寫dealloc方法,在方法中釋放該物件...

iOS之手動記憶體管理

記憶體管理是每個程式設計師必須要掌握的技能,也是寫好乙個程式,寫乙個好程式的必備技能.下面談一下我對ios開發中的記憶體管理的理解.如果你是乙個比較新的ios程式設計師,那麼恭喜你,你已經很輕鬆了,因為在現在的開發中已經很少去手動管理記憶體了,那麼問題來了,既然不需要去手動管理了那學他還有什麼用呢?...