2013-10-23 59 views
0

我在cocos2d-iphone 1.0.1上遇到EXC_BAD_ACCESS問題。CCMenu導致EXC_BAD_ACCESS錯誤,但我不能回溯我的代碼

我已啓用NSZombies,希望看到我的代碼在哪裏訪問我不應該訪問的對象。在CCMenu.m發生

的問題,在這裏:

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    NSAssert(state_ == kCCMenuStateTrackingTouch, @"[Menu ccTouchMoved] -- invalid state"); 

    CCMenuItem *currentItem = [self itemForTouch:touch]; 

    if (currentItem != selectedItem_) { 
     [selectedItem_ unselected]; // <--- selectedItem_ is a zombie 
     selectedItem_ = currentItem; 
     [selectedItem_ selected]; 
    } 
} 

我可以觀察到selectedItem_是一具殭屍。

這是CCMenu代碼,不是我的 - 我應該看看我自己的代碼。所以我來看看回溯:

enter image description here

這並不能真正幫助我:回溯沒有達到我自己的代碼。這是cocos2d-iphone的代碼。

我應該怎麼做才能解決這個錯誤呢?

+0

對於好奇,[我發現這個問題(http://stackoverflow.com/q/19533400/555690) - 但我仍然想知道如何解決這樣的問題,因爲這我只是幸運而已。 – Voldemort

回答

-1

歐米茄,你應該小心與所有權:

if (currentItem != selectedItem_) 
     selectedItem_ = currentItem; // is plain wrong on non ARC mode. 

你應該......合成保留制定者selectedItem_

@property(nonatomic, retain) CCMenuItem* selectedItem; 

@synthesize selectedItem; 

然後使用二傳手assignement。不是普通的指針分配。

self.selectedItem_ = currentItem; 
// is actually kind of 
// [selectedItem_ autorelease] 
// selectedItem_ = [currentItem retain] 
+0

你的回答不正確。執行該例程時,selectedItem_和currentItem都將保留在數組中。我能看到的唯一原因是@Omega以某種方式移除了作爲CCMenu的子項的selectedItem_,而不重寫CCMenu的'removeChild'方法,以便在從陣列移除後將指定的iVar設置爲nil。 – YvesLeBorg

+0

伊夫,我的解決方案是不正確的(我沒有看到它在CCmenu裏面)。但CCMenu的設計仍然依賴所有權GUI。是的,這不是使應用程序真正崩潰的原因,而是客戶端實施的結果。順便說一下,你應該承認selectedItem_的使用依賴於很多GUI邏輯。你說過,selectedItem_被彈出子級別,這就是讓selectedItem_懸空的原因。事實是,SelectedItem_不應該晃來晃去,不應該發生。即使該代碼的客戶端沒有做到預期的事情,也不應該這樣崩潰 –

+1

順便說一句,偉大的遊戲這個「最大功率冒險」;)。我是一個很大的粉絲 –

相關問題