iOS開發中遇到BAD_ACCESS怎麼辦?

hither發表於2017-12-13

在我們開發中經常會遇到BAD_ACCESS這樣的錯誤,不用想這就是記憶體洩漏,即使在現在ARC的大環境下,也會遇到記憶體過度釋放或是記憶體洩露的問題;

##下面介紹兩種方法來處理BAD_ACCESS: ————————————————————————————— 方案一:

使用Xcode自帶的Instrument,長這個樣子的:

iOS開發中遇到BAD_ACCESS怎麼辦?

假設現在有一段程式碼存在記憶體洩漏的問題,使用這個工具的步驟如下:

1.設定殭屍物件 (作用是:假設有個物件記憶體被釋放了,但是你想找到問題所在,這個物件就會讓這個物件的記憶體不會被釋放,就像活死人一樣,但是切記,解決問題以後,一定要把殭屍物件去掉,不然會遇到很多莫名其妙的Bug)

如圖所示 開啟scheme:

iOS開發中遇到BAD_ACCESS怎麼辦?

  • 開啟以後介面是這個樣子的,我們使用Instrument 找記憶體洩漏就需要配合殭屍物件,所以接下來我們需要設定殭屍物件;

iOS開發中遇到BAD_ACCESS怎麼辦?

2.如圖所示 通過這種方式 開啟Instrument

iOS開發中遇到BAD_ACCESS怎麼辦?

3.開啟的介面是這樣的,按照圖中所示進行選擇:

iOS開發中遇到BAD_ACCESS怎麼辦?

4.進入這樣的介面,按照圖中所示,進行操作:

iOS開發中遇到BAD_ACCESS怎麼辦?

然後你就會看到這個程式執行起來後的樣子,如圖所示:

iOS開發中遇到BAD_ACCESS怎麼辦?

點選你的模擬器 要出問題的地方,把程式搞崩潰,返回到Instrument中,按照下圖進行操作:

iOS開發中遇到BAD_ACCESS怎麼辦?

點了這個箭頭進去以後,注意到了麼? 有變灰色的行出現了,這就是我們出問題的地方,雙擊這一行進去,就可以定位到我們出問題的地方了:

iOS開發中遇到BAD_ACCESS怎麼辦?

這裡的例子就是因為,二級頁面中沒有移除通知,導致雖然二級頁面pop以後,頁面雖然沒有了,但是這個物件始終沒有釋放掉,仍有一個物件持有他,這就比較尷尬了,就會出現野指標,導致記憶體問題,不論是ARC還是MRC,都要記住,誰汙染誰處理,物件的引用計數為0,才能得到釋放;

—————————————————————————————

方案二:

使用終端命令列加schme的方式進行尋找;

還是使用上面那個例子喲~

  1. 編輯scheme,如圖所示:

iOS開發中遇到BAD_ACCESS怎麼辦?

2.注意到了麼?如下圖,你的控制檯多了點東西,兩個箭頭指的東西都是一樣的,我們需要的是前面的那個程式的pid,如1527;

iOS開發中遇到BAD_ACCESS怎麼辦?

3.執行你的程式,讓它崩潰,在這個例子中,崩潰以後會在控制檯輸出這樣一句話:

message sent to deallocated instance 0x7ff8fdd2f9c0
//0x7ff8fdd2f9c0就是這個物件
複製程式碼

4.使用終端,查詢問題:

輸入:sudo malloc_history 1527 0x7ff8fdd2f9c0

第一輸入,會讓你輸入這臺電腦的密碼,輸入就是了,沒有關係的;
複製程式碼

5.結尾,是不是和上面我們用Instrument找到的同一個地方呢?一般出問題的程式碼都在| _objc_rootAlloc | class_createInstance | calloc | malloc_zone_calloc 這些程式碼的前面

iOS開發中遇到BAD_ACCESS怎麼辦?

—————————————————————————————

##補充:

1.寫通知 和 NSTimer記住要釋放,Block中解決迴圈引用。

2.全域性斷點:

iOS開發中遇到BAD_ACCESS怎麼辦?

3.庫檔案衝突的時候記住:

要麼重新pod 要麼刪掉重複的 要麼在other link flag刪掉重複的 要麼在搜尋框搜尋重複的 再刪除重複的(比如環信帶音視訊框架和B站框架一起 匯入 就會出現這種問題 或者專案已經有MJRefresh 等 再匯入環信 也會報重複庫檔案衝突)

相關文章