雖然ios 5.0版本之後加入了arc機制,由於相互引用關係比較複雜時,記憶體洩露還是可能存在。所以了解原理很重要。
這裡講述在沒有arc的情況下,如何使用instruments來查詢程式中的記憶體洩露,以及nszombieenabled設定的使用。
本文假設你已經比較熟悉obj-c的記憶體管理機制。
實驗的開發環境:xcode 4.5.2
在崩潰的地方斷住了,知道crash的地方了,但是不知道具體crash的原因。
設定步驟:1
2:勾上紅色框裡的
執行,按剛才的操作選中其中的cell。再次crash,這次在output視窗會看到多了一項錯誤資訊:
2012-11-28 13:22:08.911 propmemfun[2132:11303] *** -[cfstring respondstoselector:]: message sent to deallocated instance 0x713ebc0
大概意思是:向已釋放的記憶體傳送訊息。也就是說使用了已釋放的記憶體,在c語言相當於使用了「野指標」
看了下crash的這個語句,sushistring應該是沒問題的,它是從stringwithformat初始化出來的。那就是_lastsushiselected的問題。
_lastsushiselected指向了sushistring,sushistring是乙個autorelease變數。 在第二次點選時,使用的是sushistring已經被釋放,所以crash了。那為_lastsushiselected保留一下,就可以用了。**修改如下:
[cpp]view plain
copy
_lastsushiselected = [sushistring retain];
執行,這時候不崩潰。
分析之後可以看到:
這裡提示alertview沒被釋放,有記憶體洩露,那我們釋放
[alertview release];
再分析,這個問題解決了。
分析記憶體洩露不能把所有的記憶體洩露查出來,有的記憶體洩露是在執行時,使用者操作時才產生的。那就需要用到instruments了。
按上面操作,build成功後跳出instruments工具,選擇leaks選項,這時候壽司程式也執行起來了,選中list中的項,拖動等操作後,工具顯示效果如下:
大家可能都能猜到,紅色的柱子表示記憶體洩露了。怎麼通過這個工具看到在哪洩露了呢?
先在工具欄按下紅色的圓形按鈕,把工具監視記憶體的活動停下來。選擇leak,然後點中間十字交叉那,選擇call tree.
這時候左下角的call tree的可選項可以選了。選中invert call tree 和hide system libraries,顯示如下:
這時候記憶體洩露的具體**找到了,在右邊的紅色框框裡指定了哪個方法出現了記憶體洩露。
你只要在這些方法上雙擊,就會跳轉到具體的**,哈哈,是不是很方便。
這裡應該是提示100%記憶體會洩露。
問題找到了,那就解決吧
sushistring變數通過autorelease建立,它的引用計數是1.
這行**使得引用計數增加到2, _lastsushiselected = [sushistring retain];
這個方法結束時,sushistring的autorelease生效了,這個變數的引用計數減少為1
當再次執行tableview:didselectrowatindexpath這個方法時,_lastsushiselected被賦值了新指標,老的_lastsushiselected的引用計數還是1,沒有被釋放,產生了記憶體洩露。
怎麼解決呢?
在_lastsushiselected = [sushistring retain];之前把原來的release就ok了:
[cpp]view plain
copy
[_lastsushiselected release];
_lastsushiselected = [sushistring retain];
這個比較明顯,sushistring被alloc和init之後就沒有釋放,可以用stringwithformat來呼叫autorelease,**如下:
[cpp]view plain
copy
nsstring *sushistring = [nsstring stringwithformat:@"%d: %@", indexpath.row, sushiname];
好了,洩露都fix了,再用工具分析看看,這時候你再點,再拖,再怎麼操作,都沒有記憶體洩露了。表明記憶體洩露被堵住了。
本文參考:
ios Instruments基本過程
前言 instruments應用有很多強大的功能,它原生支援很多instrument工具,幫助你分析你的 不僅包括記憶體檢測和自動化測試,它還可以監測檔案讀寫操作等等待。所以乙個好的ios開發者應該掌握instrument的使用。但因為instruments應用本身功能太強大的,完全掌握很困難,掌握...
關於開發ios instruments效能工具
1 libimobiledevice原理是破解itunes和iphone通訊後,實現了該協議。itools也是用這玩意 1.1 通過使用make命令執行makefile檔案,從而libimobiledevice整個工程編譯成多個可執行檔案,拿到裝置 uuid,裝置名稱,裝置字元模型,cpu架構,網絡...
內點法python 內點法
文字理解 內點法屬於約束優化演算法。約束優化演算法的基本思想是 通過引入效用函式的方法將約束優化問題轉換成無約束問題,再利用優化迭代過程不斷地更新效用函式,以使得演算法收斂。內點法 罰函式法的一種 的主要思想是 在可行域的邊界築起一道很高的 圍牆 當迭代點靠近邊界時,目標函式徒然增大,以示懲罰,阻止...