我使用了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]];
}
我該如何克服這種崩潰和內存泄漏?
您可以爲mPirateDashAnim創建一個屬性並在setter中保留/正確釋放它!看起來像你在這裏指出的對象有問題(如果你保留它太多 - >泄漏,如果你不保留 - >崩潰)...有一種處理屬性的標準方式:https:/ /developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html –
@AndyM,這裏看到的情況是不同的,在runAction內存結束時會自動釋放。 – Guru