2012-10-22 86 views
0

我使用了cocos2d 2.0,當精靈動畫切換時觀察到崩潰。這裏是代碼Cocos2d第二次播放動畫導致崩潰

@interface PPActor : CCSprite 
{ 
    CCRepeatForever *pirateIdleAnim; 
    CCSequence  *mPirateDashAnim; 
    CCRepeatForever *mPirateRocketAnim; 

} 

//案例1:墜毀,機上玩第二次

-(void)loadAnim 
{ 

    CCAnimate *AnimActions = [CCAnimate actionWithAnimation:animation]; 
    id calFun = [CCCallFunc actionWithTarget:self selector:@selector(dashAnimDone)];           
    mPirateDashAnim = [CCSequence actions:AnimActions, calFun, nil]; 
    mPirateDashAnim.tag = kTagDashAnim; 
} 

-(void)runDashAnim 
{ 
     [self stopActionByTag: kTagDashAnim]; 
     [self runAction:mPirateDashAnim]; 
} 

//案例2:沒有崩潰,但顯示...內存泄漏(使用保留)

-(void)loadAnim 
{ 

    CCAnimate *AnimActions = [CCAnimate actionWithAnimation:animation]; 
    id calFun = [CCCallFunc actionWithTarget:self selector:@selector(dashAnimDone)];          
    mPirateDashAnim = [[CCSequence actions:AnimActions, calFun, nil] retain]; 
    mPirateDashAnim.tag = kTagDashAnim; 
} 

-(void)runDashAnim 
{ 
     [self stopActionByTag: kTagDashAnim]; 
     [self runAction:mPirateDashAnim]; 
} 

//案例3:再次崩潰觀察

-(void)loadAnim 
{ 

    CCAnimate *AnimActions = [CCAnimate actionWithAnimation:animation]; 
    id calFun = [CCCallFunc actionWithTarget:self selector:@selector(dashAnimDone)];          
    mPirateDashAnim = [CCSequence actions:AnimActions, calFun, nil]; 
    mPirateDashAnim.tag = kTagDashAnim; 
} 

-(void)runDashAnim 
{ 
     [self stopActionByTag: kTagDashAnim]; 
     [self runAction:[mPirateDashAnim copy]]; 
} 

我該如何克服這種崩潰和內存泄漏?

+0

您可以爲mPirateDashAnim創建一個屬性並在setter中保留/正確釋放它!看起來像你在這裏指出的對象有問題(如果你保留它太多 - >泄漏,如果你不保留 - >崩潰)...有一種處理屬性的標準方式:https:/ /developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html –

+0

@AndyM,這裏看到的情況是不同的,在runAction內存結束時會自動釋放。 – Guru

回答

1

你總是在runDashAnim之前調用loadAnim嗎?因爲動作是一次性對象。行動結束後,它會自行釋放。你必須再次創建動作。

請不要遵循建議保留操作的「最佳實踐」。這是一個糟糕的做法,因爲除非你知道一個行爲的內部行爲(即代碼),否則存在產生內存泄漏或崩潰的風險,因爲並非所有行爲都可以以這種方式重用。

+0

只有一次調用loadAnim,並且每次加載框架都需要時間。對於這個問題,最佳解決方案是什麼先生? – Guru