2011-08-11 80 views
0

當在Objective-C中調用選擇器時,應用程序崩潰導致調試堆棧指向選擇器,這是什麼原因?據我所知,這是由於內存錯誤造成的。但是,我發送命令的對象和參數(數組)都是有效的。我可以告訴,因爲這兩個對象顯示內存位置以及在Xcode中被隱藏時的其他信息。調用選擇器時,什麼原因導致「EXC_BAD_ACCESS」?

由於跡線在此選擇器處結束,所以我不知所措。堆棧指向具有有效對象參數的選擇器時,我從來沒有見過這個錯誤。

此外,這個選擇器被頻繁調用。它總是處理相同類型的對象,並且在我崩潰之前沒有任何異常行爲。
這個崩潰很少​​發生,每10分鐘或更少發生。

因爲我是新手程序員,所以選擇器內的代碼可能有問題。我經常比較的對象指針像這樣:

if (thisObject.pointerToSomeObject == nil) { //do stuff... 

我開始懷疑這是正確的Objective-C編程,但話又說回來,代碼工作的大部分時間。有沒有我不知道的一個角落案件?

附加信息: 我使用的是cocos2d版本1.0.0,Xcode 4.1。在iPad模擬器上測試。

任何幫助表示讚賞,即使鏈接到相關的調試文章將有所幫助。


編輯

發展:

默認調試線程指向一個選擇,一個壞的訪問錯誤可能意味着壞訪問的是,選擇的執行中發生的事情。可以打開NSZombies的進一步調試來查找確切的行。

所以,打開NSZombies之後,問題就更加詳細地揭示了。 (感謝@Lou佛朗哥的壞訪問教程)

現在,什麼會導致:

if ([thisZombie target] == nil) 

[thisZombie target]訪問整數時,以評估NO,而是拋出一個壞的訪問? 該target是一個指向一個NSObject(zombified)

else { 

    int diffx = [thisZombie x] - [[thisZombie target] x]; 
    //           ^^ ----- bad access here 

**編輯2 **

必須有一些錯誤的語法,或短路評價:

if (!thisZombie.target && thisZombie.leader && !thisZombie.leader.dead) 

thisZombie.leader。死了停止線用: 「* - [殭屍死]:發送到釋放實例消息0x2108f0」

我想我應該提到的是這遊戲有「植物大戰殭屍」,這是不是與「NSZombie混淆「

因此,該程序評估」thisZombie.target「爲」true「 ,但是當我去訪問」thisZombie.target.x「程序停止執行。

爲什麼?


編輯3

大家好, 我想再次感謝大家的有益的意見和建議。 我決定徹底改變我的殭屍跟隨他們的領導者來解決這個問題。

我仍然不知道什麼會導致如上所述的評估,但答案不再需要。

回答

1

我寫這個博客,以幫助理解和調試EXC_BAD_ACCESS

http://loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

按照容易爲了

  1. 運行構建與分析 - 你得到一個乾淨的構建?看看它在說什麼,但你現在可以忽略泄漏問題 - 尋找將消息發送到已發佈對象的問題

  2. 使用NSZombiesEnabled運行 - 這會使對象永不釋放,然後在發送消息時發出抱怨一個對象的retainCount爲0.

  3. 啓用Guard Malloc,然後使用特殊的GDB命令檢查堆的完整性。問題在於,您需要在崩潰之前逐步完成並找到真正的問題。它可能會在更接近你的問題的其他地方崩潰,雖然

編輯:根據您的信息以上。您已取消分配thisZombie.leader,但您並未將其設置爲零。也許,你忘了讓這個殭屍保留它,所以它很早就被釋放了。

如果有循環引用(殭屍指向領導者和領導者指向後面),這可能會很棘手。如果不是圓形的,記得要保留你設置一個屬性的任何對象(如果您使用保留的屬性自動和記得要經常使用屬性語法)爲指向

In Objective-C on iOS, what is the (style) difference between "self.foo" and "foo" when using synthesized getters?

+0

我遵循你的教程,它幫助了很多。我相信我會用我將來學到的東西。萬分感謝! – ThompsonCodes

+0

@ user890499如果這是最好的答案,並且它對你有幫助,那麼請考慮點擊旁邊的那個小複選標記。這標誌着答案被「接受」,以便未來的用戶知道什麼工作。 – PengOne

+0

它沒有解決它,但它有助於縮小問題和顯着的問題。仍在尋找答案。 – ThompsonCodes

0

即使對象顯示內存位置並不意味着它是有效的。它可能被釋放,你只是拿着指向垃圾的指針。

+0

記錄目標對象和單個參數(一個數組)給出了詳細的結果。我不相信這些會被釋放。我已經將日誌添加到這些對象的dealloc方法來確保這一點。我沒有意識到內存位置並不一定意味着它是有效的。謝謝 – ThompsonCodes

0

你需要檢查,如果你的數組或其他變量已被初始化或沒有。使用NSLog或斷點可以幫助您找到導致此錯誤的確切變量。如果是由於某些參數傳遞或返回,那麼由Max提出的原因也是有效的。

如果您可以發佈代碼,這將有助於找到確切的問題。

相關問題