用NSZombieEnabled解決惱人的EXC_BAD_ACCESS錯誤

modun1986發表於2011-06-27

轉自:http://www.cocoachina.com/iphonedev/sdk/2011/0626/2980.html

 

 有時開發者會遇到這樣的問題:程式突然Crash,出現EXC_BAD_ACCESS錯誤。但是不是每次都Crash,Debug時最終基本停在objc-msgsend這裡,十分令人費解。

    首先解釋下EXC_BAD_ACCESS,當你向已經釋放的物件傳送訊息時就會出現這種錯誤。

    至於NSZombieEnabled,就是當設定NSZombieEnabled環境變數後,一個物件銷燬時會被轉化為_NSZombie,個人感 覺和執行緒的那幾個狀態有些相似,設定NSZombieEnabled後,當你向一個已經釋放的物件傳送訊息,這個物件就不會向之前那樣Crash或者產生 一個難以理解的行為,而是放出一個錯誤訊息,然後以一種可預測的可以產生debug斷點的方式消失(原文是die),因此我們就可以找到具體或者大概是哪 個物件被錯誤的釋放了。

    設定NSZombieEnabled的方法如下

  1. 在XCode左邊那個Groups & Files欄中找到Executables,雙擊其中的一項,或者右鍵Get Info;
  2. 切換到Arguments
  3. 這裡一共有兩個框,在下面那個Variables to be set in the environment:點+號新增一項,Name裡填NSZombieEnabled,Value填Yes,要保證前面的鉤是選中的。

    好了,趕緊去找哪裡出了問題吧,至於取消NSZombieEnabled,就是吧剛才提到的那個鉤取消即可。

    最後總結一下感想,首先是我對EXC_BAD_ACCESS這個錯誤還沒有足夠的認識,其次是我沒有儘快的去搜尋一下解決方法,這兩點導致我浪費了大量時間做各種各樣奇怪的除錯。幸好現在解決了,可以繼續工作了。

相關文章