EXC_BAD_ACCESS小結(jié)

  • 簡單的理解:當(dāng)遇到了EXC_BAD_ACCESS異常,意味著訪問了一個(gè)已經(jīng)被釋放的內(nèi)存區(qū)域。
  • 指針層面理解:從C、OC語言來解釋,我們平時(shí)所操作的對象其實(shí)是一個(gè)指針,指針是指向另一塊存儲(chǔ)區(qū)域的變量。當(dāng)向一個(gè)對象發(fā)送消息,指向這個(gè)對象的指針需要被使用,也就是你獲得了指針指向的內(nèi)存地址并且可以訪問該內(nèi)存塊的值。當(dāng)系統(tǒng)不再為你映射該內(nèi)存塊時(shí),換句話說,該內(nèi)存塊已經(jīng)不能夠被你所使用,則不可以再次訪問該內(nèi)存塊。 如果再次訪問這塊內(nèi)存,發(fā)生這種情況時(shí),內(nèi)核會(huì)發(fā)送一個(gè)異常(EXC),表明您的應(yīng)用程序無法訪問該內(nèi)存塊(BAD ACCESS)。

總之,當(dāng)遇到了EXC_BAD_ACCESS異常,意味你嘗試向一個(gè)塊已經(jīng)不能執(zhí)行這個(gè)消息的內(nèi)存塊發(fā)送消息。在某些情況下,訪問野指針也會(huì)導(dǎo)致EXC_BAD_ACCESS。當(dāng)應(yīng)用程序嘗試去使用一個(gè)野指針的時(shí)候,EXC_BAD_ACCESS就會(huì)被內(nèi)核拋出。

調(diào)試EXC_BAD_ACCESS

因?yàn)楫?dāng)內(nèi)存塊不能被應(yīng)用程序所使用的時(shí)候,并不會(huì)立即出現(xiàn)crash,所以導(dǎo)致調(diào)試EXC_BAD_ACCESS很麻煩。

對于野指針也是同樣的,應(yīng)用程序不會(huì)立即崩潰如果存在野指針,只有當(dāng)應(yīng)用程序試圖去使用野指針的時(shí)候才會(huì)崩潰。

僵死對象

僵尸對象聽起來有點(diǎn)奇怪,但確實(shí)是可以用來幫助調(diào)試EXC_BAD_ACCESS問題。非常有效!

Xcode中,可以開啟僵尸對象模式。


之所有調(diào)試EXC_BAD_ACCESS非常麻煩是因?yàn)椴恢缿?yīng)用程序要訪問哪個(gè)對象。僵尸對象可以解決這個(gè)問題。通過讓已經(jīng)被釋放的對象存活,Xcode可以告訴我們正在訪問哪個(gè)被釋放的對象,進(jìn)而找到是什么原因引起的。

僵尸對象并不能把所有的EXC_BAD_ACCESS找出來。所以必須時(shí)需要通過下面的一些方式來解決——比如靜態(tài)分析。

靜態(tài)分析

如果僵尸對象不能解決問題,可以通過靜態(tài)分析的方法來提前發(fā)現(xiàn)。

可以從Xcode中的Product中選則Analyze,或者直接Shfit+Command+B。Xcode將會(huì)花點(diǎn)時(shí)間把問題的部分有問題的代碼羅列出來。類似于:


當(dāng)點(diǎn)擊相關(guān)的issue時(shí),就會(huì)調(diào)到對應(yīng)的代碼位置。Xcode只是會(huì)做出相應(yīng)的提示,在某些情況下,可能某些情況下不用修復(fù)。

  • 如果不能準(zhǔn)確的定位問題,那么就只通過靜態(tài)分析一個(gè)一個(gè)Issue去排查。

總結(jié)

EXC_BAD_ACCESS是一個(gè)比較常見的但同時(shí)也非常麻煩的問題。這是問題是從手動(dòng)管理內(nèi)存一直延續(xù)下來的,雖然現(xiàn)在大部分都是用ARC,但是并不會(huì)意味著EXC_BAD_ACCESS就消失。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容