2010-07-18 91 views
0

我有以下代碼:EXC_BAD_ACCESS在IPhone的Cocos2D

-(void) changeAnimation:(NSString*)name forTime:(int) times { 
if(currentAnimation != @"attack") 
{ 
    id action = [CCAnimate actionWithAnimation:[self animationByName:name]]; 
    id repeatAction = [CCRepeat actionWithAction:action times:times]; 
    currentAction = [self runAction:repeatAction]; 
    lastANimation = currentAnimation; 
    currentAnimation = name; 
} 
else if(currentAction.isDone) 
{ 
    //Here is where I would change the animation 
    //but I commented the code for now 
} 
} 

所以,當我運行這個,然後點擊要「攻擊」(通過調用[MySprite的changeAnimation改變動畫按鈕:@「攻擊」 forTime :1];),我從「currentAction.isDone」行中獲得一個EXC_BAD_ACCESS錯誤,下次調用該函數時(遊戲杆將調用changeAnimation嘗試將動畫更改爲「運行」或「空閒」,但是我首先要讓攻擊動畫完成)。任何想法爲什麼我得到這個? currentAction在我的類中聲明。

編輯:除了getter之外,在類的其餘部分沒有任何與currentAction交互的東西。它的聲明在.h(CCAction * surrentAction)中。我需要初始化它嗎?我認爲runAction的返回值就足夠了?反正,當我運行調試器時,它不是零,並分配給正確的操作。

感謝,

戴夫

編輯: 我結束了創建時「攻擊」調用該改變currentAnimation函數序列,所以我回避這個問題。仍然不知道發生了什麼。 這裏的,如果你有興趣的答案: Other Post

+0

真的需要看到班上其他同學 - 在那裏,你是如何定義currentAction以及如何互動它來回答。 – heckj 2010-07-18 18:30:03

+0

@heckj:請參閱編輯問題,其他內容?謝謝! – 2010-07-18 18:35:06

+0

猜測它與錯誤無關,但應該在條件中使用isEqualToString:。 – user123444555621 2010-07-18 20:53:19

回答

1

更多的類大概需要真正回答這個正常,但EXC_BAD_ACCESS通常是因爲你所訪問的東西,已被釋放,不再可用內存。

我猜你在課堂上的某個地方要麼顯式地,要麼隱式地釋放「currentAction」對象 - 並且當你在稍後檢查時,它已經完成了&,你正在碰到這個不速之客。

一般來說,保持一個狀態變量或兩個你總是已知的值是一個好方法,對於你正在經歷的「動作」,如果它們是異步的,並且執行它們自己的記憶管理,讓它們保持原樣並通過你維護的一些狀態變量來工作,並控制所有的內存管理。它是異步回調一個相當合理的模式,無論是與經典的東西,或者你進入使用塊與iOS 4.0

+0

thx爲答案,我沒有做任何內存管理,因爲我明白,cocos2d照顧它(至少對於它創建的所有對象,如我的currentAction)。我很想維護一個狀態變量(這就是爲什麼我有最後一個和當前的動畫),但是我需要知道什麼時候攻擊行動結束了以啓動另一個行爲。我不知道我是否清楚?我可以明確地阻止我的currentAction對象的內存釋放? – 2010-07-18 18:38:32

+0

爲了達到這個目的,我認爲你需要涉足cocos2D,而我並沒有太多的知識。你有正確的想法 - 在某處插入Cocos2D,並讓它回調出來,讓你知道什麼時候發生了變化 - 從那裏更新你的狀態變量。 聽起來像你已經有效地解決了你的解決方案的問題。 – heckj 2010-07-18 22:31:09