0

我使用 cocos2d 2.0,观察到精灵动画切换时崩溃。这是代码

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

}

//情况一:玩第二次就崩溃了

-(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:没有crash,但是显示内存泄漏...(使用retain)

-(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]];
}

如何克服这种崩溃和内存泄漏?

4

1 回答 1

1

你总是在 runDashAnim 之前调用 loadAnim 吗?因为动作是一次性的对象。当动作完成时,它会释放自己。您必须再次创建操作。

请不要遵循建议保留操作的上述“最佳实践”。这是不好的做法,因为除非您知道操作的内部行为(即代码),否则存在造成内存泄漏或崩溃的风险,因为并非所有操作都可以以这种方式重用。

于 2012-10-22T17:41:02.037 回答