當(dāng)工程崩潰在main.m的時(shí)候,我的內(nèi)心也是崩潰的恕洲!根本就不知道為什么蹦嘛H〗佟?
這里研侣,分享幾個(gè)調(diào)試內(nèi)存錯(cuò)誤的方法谱邪,希望大家也能從中找出BUG原因!~
目錄:
1.手動設(shè)置NSZombieEnabled
2.Instruments中的Leake
3.Instruments中的Zombies
4.Analyze工具靜態(tài)分析內(nèi)存泄露
運(yùn)行工程后,在main.m中崩潰庶诡,此時(shí) 圖1 顯示是:
EXC_BAD_ACCESS(code=1,address=0x10)
遇到EXC_BAD_ACCESS這個(gè)錯(cuò)誤時(shí)惦银,意味著你向一個(gè)已釋放的對象發(fā)送消息。
1.手動設(shè)置NSZombieEnabled
在僵尸模式下末誓,當(dāng)你對某個(gè)已被僵尸對象(已被釋放的對象)發(fā)送消息時(shí)扯俱,應(yīng)用會因?yàn)?b>EXC_BAD_ACCESS 而崩潰,并打印出發(fā)送這個(gè)消息的對象喇澡,這時(shí)我們就可以進(jìn)行操作啦迅栅!~
調(diào)試操作如下圖
設(shè)置好僵尸模式后,運(yùn)行工程晴玖。
發(fā)現(xiàn)工程向一個(gè)僵尸對象發(fā)送了消息導(dǎo)致了崩潰读存,此時(shí)打印出以下信息:
發(fā)現(xiàn)是 BMKGeoCodeSearch 過度釋放了!
在Xcode中Comamd+3呕屎,左邊菜單跳轉(zhuǎn)到?放大鏡 后让簿,搜索關(guān)鍵詞。
由于我的應(yīng)用是在百度地圖定位后崩潰秀睛,所以跳轉(zhuǎn)到對應(yīng)頁面尔当。
發(fā)現(xiàn)之前這里用另一個(gè)屬性去繼承了它,并且又再次釋放了(接收別人工程的坑啊...)蹂安,這里將 ? ??圖7 ?刪除 或 // 就可以了椭迎,運(yùn)行工程就不再崩潰了锐帜。
2.Instruments中的Leake
command+i 就可以調(diào)出這個(gè)模式
Instruments非常實(shí)用,可以測試工程的許多問題畜号,內(nèi)存優(yōu)化缴阎、檢測隱藏bug之類的,感興趣的可以去搜索一下弄兜,這里只介紹 Leake 這個(gè)功能,它用于找出APP中的泄露問題药蜻。
PS:真機(jī)測試不能用生產(chǎn)證書喲,會無法使用的替饿。
雖然是跳轉(zhuǎn)到這里语泽,并不精確是紅色的這一段出錯(cuò),但能確定的是出錯(cuò)原因在這個(gè)方法中视卢,仔細(xì)看了就發(fā)現(xiàn)踱卵,在方法的最后由于多釋放了一次導(dǎo)致奔潰。
3.Instruments中的Zombies
兩種調(diào)試的僵尸模式据过,推薦使用這種惋砂,個(gè)人感覺更加清晰明了,看圖說話绳锅。
點(diǎn)擊紅點(diǎn)運(yùn)作后西饵,出現(xiàn)一個(gè)彈框,點(diǎn)擊箭頭打開 圖14
關(guān)鍵的地方來啦鳞芙!
4.Analyze工具靜態(tài)分析內(nèi)存泄露
shift+command+b?眷柔,Xcode就會幫你編譯一次,并且找你找出有缺陷的代碼原朝,很多提示都是無用的驯嘱。所以,這個(gè)需要自行判斷喳坠,在你覺得有問題的地方中查看是否有內(nèi)存泄露的問題鞠评。點(diǎn)進(jìn)去看看吧!
以上就是本人整理和歸納的一些方法壕鹉,希望能幫到大家 :)
參考鏈接: