動態記憶體洩露分析
2、xcode自帶的工具
instrument中的leaks、allocations工具可以幫助我們進行記憶體洩露的排查,但它們存在不足。
在 arc 時代更常見的記憶體洩露是迴圈引用導致的 abandoned memory,leaks 工具查不出這類記憶體洩露,應用有限;
instrument 的 allocations 檢測出 abandoned memory,但是用起來不方便,需要乙個乙個地重現場景,且無法及時的知道洩露,比較繁瑣。總之,一句話就是,不好使。
4、動態檢測工具:mleaksfinder
1)mleaksfinder檢測記憶體洩露原理
mleaksfinder用於檢測viewcontroller、view是否存在記憶體洩露的情況。
當乙個 uiviewcontroller 被 pop 或 dismiss 後,該 uiviewcontroller 包括它的 view,view 的 subviews 等等將很快被釋放(除非你把它設計成單例,或者持有它的強引用,但一般很少這樣做)。於是,我們只需在乙個 viewcontroller 被 pop 或 dismiss 一小段時間後,看看該 uiviewcontroller,它的 view,view 的 subviews 等等是否還存在。
具體的方法是,為基類 nsobject 新增乙個方法 -willdealloc 方法,該方法的作用是,先用乙個弱指標指向 self,並在一小段時間(3秒)後,通過這個弱指標呼叫 -assertnotdealloc,而 -assertnotdealloc 主要作用是直接中斷言。
- (bool)willdealloc );
return
yes;
}- (void)assertnotdealloc
[mleakedobjectproxy addleakedobject:self];
}
這樣,當我們認為某個物件應該要被釋放了,在釋放前呼叫這個方法,如果3秒後它被釋放成功,weakself 就指向 nil,不會呼叫到 -assertnotdealloc 方法,也就不會中斷言,如果它沒被釋放(洩露了),-assertnotdealloc 就會被呼叫中斷言。這樣,當乙個 uiviewcontroller 被 pop 或 dismiss 時(我們認為它應該要被釋放了),我們遍歷該 uiviewcontroller 上的所有 view,依次調 -willdealloc,若3秒後沒被釋放,就會中斷言,並且呼叫[mleakedobjectproxy addleakedobject:self];該方法會獲取記憶體洩露的資訊,並彈框顯示。 常見動態記憶體錯誤 記憶體洩漏
常見動態記憶體錯誤 編譯器不能自動發現動態記憶體錯誤,動態記憶體錯誤通常只能在程式執行時才能 捉到,而且錯誤原因不容易查詢,錯誤本身也不容易捕捉,改錯難度較大。1.動態記憶體分配失敗卻繼續操作 記憶體不足等有可能導致動態記憶體分配失敗,所以使用new請求分配動態記憶體後一定要檢查返回位址是否為nul...
動態記憶體分配 記憶體洩漏及檢測
所謂動態記憶體分配 dynamic memory allocation 就是指在程式執行的過程中動態地分配或者 儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。在c中,動態記憶體分配使用...
傳遞動態記憶體
當你涉及到c c 的核心程式設計的時候,你會無止境地與記憶體管理打交道.這些往往會使人受盡折磨.所以如果你想深入c c 程式設計,你必須靜下心來,好好苦一番.現在我們將討論c c 裡我認為哪一本書都沒有完全說清楚,也是涉及概念細節最多,語言中最難的技術之一的動態記憶體的傳遞.並且在軟體開發中很多專業...