iOS記憶體洩漏檢測及分析

2022-09-17 06:15:08 字數 2713 閱讀 1824

我們知道,ios開發中對記憶體管理的要求非常嚴格,一旦存在記憶體洩漏,後果是非常嚴重的,會導致程式非常容易崩潰。儘管目前ios開發基本上都是採用的arc方式進行記憶體管理,但是一不小心就會存在記憶體洩漏的問題。

首先,我們需要定位記憶體洩漏的問題,目前比較常用的記憶體洩漏的排查方法有兩種,都在xcode中可以直接使用:靜態分析方法(analyze)和動態分析方法(instrument的leak)。

通過xcode開啟專案,然後點選product-->analyze,如下圖左側的圖所示,這樣就開始對專案進行靜態記憶體洩漏分析,分析結果如下圖右側的圖所示。根據分析結果進行休整之後在進行分析就好了。

靜態分析方法能發現大部分的問題,但是只能是靜態分析結果,有一些並不準確,還有一些動態分配記憶體的情形並沒有進行分析。所以僅僅使用靜態記憶體洩漏分析得到的結果並不是非常可靠,如果需要,我們需要將對專案進行更為完善的記憶體洩漏分析和排查。那就需要用到我們下面要介紹的動態記憶體洩漏分析方法instruments中的leaks方法進行排查。

分析記憶體洩露不能把所有的記憶體洩露查出來,有的記憶體洩露是在執行時,使用者操作時才產生的。那就需要用到instruments了。具體操作是通過xcode開啟專案,然後點選product-->profile,如下圖左側圖所示。

按上面操作,build成功後跳出instruments工具,如上圖右側圖所示。選擇leaks選項,點選右下角的【choose】按鈕,這時候專案程式也在模擬器或手機上執行起來了,在手機或模擬器上對程式進行操作,工具顯示效果如下:

點選左上角的紅色圓點,這時專案開始啟動了,由於leaks是動態監測,所以手動進行一系列操作,可檢查專案中是否存在記憶體洩漏問題。如圖所示,橙色矩形框中所示綠色為正常,如果出現如右側紅色矩形框中顯示紅色,則表示出現記憶體洩漏。

選中leaks checks,在details所在欄中選擇calltree,並且在右下角勾選invert call tree 和hide system libraries,會發現顯示若干行**,雙擊即可跳轉到出現記憶體洩漏的地方,修改即可。

在目前主要以arc進行記憶體管理的開發模式,導致記憶體洩漏的根本原因是**中存在迴圈引用,從而導致一些記憶體無法釋放,這就會導致dealloc()方法無法被呼叫。主要原因大概有一下幾種型別。

如果你的viewcontroller中有nstimer,那麼你就要注意了,因為當你呼叫

[nstimer scheduledtimerwithtimeinterval:1.0 

target:self

selector:@selector(updatetime:)

userinfo:nil

repeats:yes];

時的 target:self就增加了viewcontroller的return count,如果你不將這個timer invalidate,將別想呼叫dealloc。

乙個比較隱秘的因素,你去找找與這個類有關的**,有沒有強引用屬性?如果你這個vc需要外部傳某個delegate進來,來通過delegate+protocol的方式傳引數給其他物件,那麼這個delegate一定不要強引用,盡量assign或者weak,否則你的vc會持續持有這個delegate,直到它自身被釋放。

這個可能就是經常容易犯的乙個問題了,block體內使用例項變數也會造成迴圈引用,使得擁有這個例項的物件不能釋放。因為該block本來就是當前viewcontroller的一部分,現在蓋子部門又強引用self,導致迴圈引用無法釋放。 例如你這個類叫oneviewcontroller,有個屬性是nsstring *name; 如果你在block體中使用了self.name,或者_name,那樣子的話這個類就沒法釋放。 要解決這個問題其實很簡單,就是在block之前申明當前的self引用為弱引用即可。

//mrc下**如下

__block viewcontroller *weakself = self;

//arc下**如下

__weak viewcontroller *weakself = self;

這個問題也是我的專案中記憶體洩漏的問題所在。我們有時候需要在子檢視或者某個cell中點選跳轉等操作,需要在子檢視或cell中持有當前的viewcontroller物件,這樣跳轉之後的back鍵才能直接返回該頁面,同時也不銷毀當前viewcontroller。此時,你就要注意在子檢視或者cell中對當前頁面的持有物件不能是強引用,盡量assign或者weak,否則會造成迴圈引用,記憶體無法釋放。

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的reboot才會正常...

記憶體洩漏檢測

記憶體洩漏檢測 自己寫的 作者 很土 關鍵字 記憶體洩漏 記憶體 debug heap 堆 原作者姓名 很土 介紹簡單說明了一下沒有工具的情況如何運用vc庫中的工具來檢查 的記憶體洩漏問題 讀者評分 8 評分次數 2 正文記憶體洩漏檢測 一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶...