開啓Xcode對殭屍對象檢測調試
BAD_ACCESS 在什麼狀況下出現
BAD_ACCESS 報錯屬於內存訪問錯誤,會致使程序崩潰,錯誤的緣由是訪問了野指針(懸掛指針)。野指針指的是原本指針指向的對象已經釋放了,但指向該對象的指針沒有置 nil,指針指向隨機的未知的內存,程序還覺得該指針指向那個對象,致使存在一些潛在的危險訪問操做,這些危險訪問操做沒法被指針指向的未知內存所處理,就會致使BAD_ACCESS錯誤形成程序崩潰。訪問的含義包括多種狀況,例如:向野指針發送消息,讀寫野指針原本指向的對象的成員變量等等。圖片
如何調試BAD_ACCESS錯誤
首先調試BAD_ACCESS錯誤是比較困難的,咱們知道BAD_ACCESS錯誤是因爲訪問了野指針,但程序不會在野指針出現時或者在咱們訪問野指針的代碼處報錯,致使對其難以察覺,調試方法思路以下:內存
-
開啓殭屍對象診斷
首先是開啓殭屍對象診斷模式,利用殭屍對象來對野指針的出現位置提供線索。咱們知道殭屍對象指的是引用計數爲0被系統回收的對象,但這些對象暫時還存在於內存中,且理論上仍是可使用的,可是不穩定。開啓殭屍對象診斷後,殭屍對象會暫時保持活躍用於調試,咱們的野指針在對象回收後依然指向該殭屍對象,在訪問野指針也就是訪問殭屍對象的狀況下能夠被編輯器檢測出來。這個時候仍是會報BAD_ACCESS錯誤,可是後臺會打印出該線索,例以下面的訪問野指針打印的後臺信息:
能夠看出Xcode告訴咱們消息發送給了一個殭屍對象,殭屍對象本來是一個實例,但如今該對象被回收了而開發者還試圖訪問它,由此能夠很容易定位問題所在。
另外開啓殭屍對象診斷的方法爲:打開Xcode頂部導航欄的Product-Scheme-Edit Scheme,在彈出的界面中選中左側的Run模式,而後勾選右側Dianostics下的Zombie Objects。
爲何不默認開啓殭屍對象檢測呢?
由於一旦開啓,每次經過指針訪問對象的時候,都會去檢查指針指向的對象是否爲殭屍對象。因此會影響程序的執行效率,建議關閉。
-
Analyze分析
殭屍對象診斷能夠幫助快速定位多數狀況下的野指針問題,但也有時候不能奏效,這個時候只能利用Xcode的Analyze靜態分析幫助檢查可能出問題的地方,仔細檢查問題所在,比較費時。
使用方法很簡單,選中Xcode頂部導航欄Product-Analyze或使用快捷鍵Command+Shift+B,分析須要花一些時間,而後左側會列出編輯器發現的存在潛在問題的地方,選中藍色圖標對應的問題項會跳到問題項所在的代碼行。但這隻能給出一些潛在提示,幫助搜索問題所在,不必定和咱們的bug相關。
定位到問題後把野指針至nil