iOS開發(fā) 如何檢查內(nèi)存泄漏
在開發(fā)的時(shí)候內(nèi)存泄漏是不可避免的,但是也是我們需要盡量減少的,因?yàn)閮?nèi)存泄漏可能會(huì)很大程度的影響程序的穩(wěn)定性!??!最近一陣在瘋狂的查詢內(nèi)存泄漏問(wèn)題,總結(jié)有幾種方法供大家參考。
1.靜態(tài)分析
通過(guò)靜態(tài)分析我們可以最初步的了解到代碼的一些不規(guī)范的地方或者是存在的內(nèi)存泄漏,這是我們***步對(duì)內(nèi)存泄漏的檢測(cè)。當(dāng)然有一些警告并不是我們關(guān)心的可以略過(guò)。
2.通過(guò)instruments來(lái)檢查內(nèi)存泄漏
這個(gè)方法能粗略的定位我們?cè)谀睦锇l(fā)生了內(nèi)存泄漏。方法是完成一個(gè)循環(huán)操作,如果內(nèi)存增長(zhǎng)為0就證明我們程序在該次循環(huán)操作中不存在內(nèi)存泄漏,如果內(nèi)存增長(zhǎng)不為0那證明有可能存在內(nèi)存泄漏,當(dāng)然具體問(wèn)題需要具體分析。
3.代碼測(cè)試內(nèi)存泄漏
在做這項(xiàng)工作之前我們要注意一下,在dealloc的方法中我們是否已經(jīng)釋放了該對(duì)象所擁有的所有對(duì)象。觀察對(duì)象的生成和銷毀是否配對(duì)。準(zhǔn)確的說(shuō)就是 init(創(chuàng)建對(duì)象的方法)和dealloc是否會(huì)被成對(duì)觸發(fā)(簡(jiǎn)單說(shuō)來(lái)就是走一次創(chuàng)建對(duì)象就有走一次dealloc該對(duì)象)。
下面是自己遇到的一些比較隱秘的造成內(nèi)存泄漏的情況:
1.兩個(gè)對(duì)象互相擁有:也就是說(shuō)對(duì)象a里面retain/addSubview了b對(duì)象,b對(duì)象同時(shí)也retain/addSubView了a對(duì)象。注意:delegate不要用retain屬性,要用assign屬性也會(huì)導(dǎo)致互相擁有。
2.有時(shí)候需要用removeFromSuperView來(lái)釋放:具體說(shuō)明,也許我的a對(duì)象擁有一個(gè)b對(duì)象,b對(duì)象add到了c對(duì)象上,而在我們的設(shè)計(jì)中b對(duì)象的生命周期應(yīng)該和a對(duì)象相同;這時(shí)候只一句[b release]/self.b = nil是不能把b對(duì)象釋放掉的(一般情況下release會(huì)使其retainCount-1,[super dealloc]會(huì)再次將所有subView的retainCount-1,而b并不是a的subView,所有***的一次-1沒(méi)有了);所以我們需要在之前加上[b removeFromSuperView]。
希望大家都一起分享一下自己遇到過(guò)的比較隱秘的內(nèi)存泄漏方式。