內存泄漏檢測

在開發(fā)中,難免會有內存泄漏的問題,一般,通過靜態(tài)分析就可以初步的了解到代碼的一些不規(guī)范的地方或存在的內存泄漏,這是我們第一步做的內存檢測。

但由于應用的開發(fā)是動態(tài)執(zhí)行的,單單從程序上看是看不出有哪些毛病的,所以有些內存泄漏問題是應用操作時才會出現(xiàn),對于這樣泄漏問題的動態(tài)內存檢測,Xcode自帶了工具(instruments)。

使用方法:點擊Product->Profile,然后選擇leaks工具,進入界面點擊運行,instruments就會開始自動檢測內存泄漏的方法了,在此期間,可以對手機上運行的測試工程進行操作,圖形界面中,上面是Allocations,下面是Leaks,當出現(xiàn)一條紅色條柱時,就是出現(xiàn)了內存泄漏;點擊界面中間分隔條,選擇Call Tree選項,然后勾選右下角‘Invert Call Tree’和‘Hide System Libraries’選項,就可以看到具體是哪個類中的哪個方法出現(xiàn)了內存泄漏了,雙擊類名,就能顯示此類此方法中造成的內存泄漏代碼,接下來就是針對性的優(yōu)化代碼、內存優(yōu)化了。

現(xiàn)在都是ARC模式,因此一般出現(xiàn)泄漏的地方都是block中的self沒有使用weak類型;或者兩個類之間出現(xiàn)循環(huán)引用。有些第三方框架也可能會引起內存泄漏。詳見:http://blog.csdn.net/hello_hwc/article/details/46372715

代碼測試內存泄漏之前我們需注意一下,在dealloc的方法中我們是否已經釋放了該對象所擁有的所有對象。觀察對象的生成和銷毀是否配對。就是說init(創(chuàng)建對象的方法)和dealloc是否會被成對觸發(fā)(創(chuàng)建一次銷毀一次)。

遇到的一些隱秘的造成內存泄漏的情況:

1.兩個對象互相擁有:a對象retain/addSubview了b對象,b對象也同時retain/addSubview了a對象。注意:delegate不要用retain屬性,會導致互相擁有。

2.有時候需要用removeFromSuperView來釋放:a對象擁有一個b對象,b對象add到了c對象上,而在我們的設計中b對象的生命周期應該和a對象相同;這時簡單一句 [b release]/self.b = nil 是不能把b釋放的(一般情況下 release會使其retainCount - 1,[super dealloc] 會再次將所有的subView的retainCount - 1,而b并不是a的subView,所有最后的一次 - 1沒有了);所以我們需要在之前加上 [b removeFromSuperView]。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容