經過上面的真機調試之后,發現我們的程序崩在了一個方法里,并且報錯 “Thread 1:EXC_BAD_ACCESS(code=1,address=0x4000)”,這種錯誤通常是內存管理的問題,一般是訪問了已經釋放的對象導致的,可以開啟僵尸對象(Zombie Objects)來定位問題。
第一步:還是打開Xcode 選擇屏幕左上角Xcode-> PReferencese,不過我們這次是要設置一下輸出信息,調試的時候輸出更多的信息,如下截圖,勾上:
image.png
第二步:再對環境變量進行設置:菜單Product > Scheme > Edit Scheme
把紅色圈里面的三個選項都勾上
image.png
開啟該選項后,程序在運行時,如果訪問了已經釋放的對象,則會給出較準確的定位信息,可以幫助確定問題所在。
該功能的原理是,在對象釋放(retainCount為0)時,使用一個內置的Zombie對象,替代原來被釋放的對象。無論向該對象發送什么消息(函數調用),都會觸發異常,拋出調試信息。
記得在問題被修復后,關閉該功能!!
第三步:設置好后調試程序,在輸出界面發現了-[CFString retain]: message sent to deallocated instance錯誤日志
到這里,就已經很明顯看出來是什么原因導致程序崩潰的了,然后再去分析代碼,靜下心來肯定能解決問題的了。
我這里是因為向一個空的NSString類型發送消息導致崩潰的,但是這個問題只在iOS9版本崩潰,iOS10就沒問題,這個還值得深究。