Cocos2d iphone Cocos2d在第二次播放动画时导致崩溃

Cocos2d iphone Cocos2d在第二次播放动画时导致崩溃,cocos2d-iphone,Cocos2d Iphone,我使用了CoCoS2D2.0,在精灵动画切换时观察到崩溃。这是代码 @interface PPActor : CCSprite { CCRepeatForever *pirateIdleAnim; CCSequence *mPirateDashAnim; CCRepeatForever *mPirateRocketAnim; } //案例1:第二次玩时崩溃 -(void)loadAnim { CCAnimate *AnimActions = [CC

我使用了CoCoS2D2.0,在精灵动画切换时观察到崩溃。这是代码

@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:没有崩溃,但显示内存泄漏…(已使用)

//案例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]];
}

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

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


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

您可以为mPirateDashAnim创建一个属性,并在setter中正确保留/释放它!看起来您在使用指向此处的对象时遇到了问题(如果保留太多->泄漏,如果不保留->崩溃)。。。这里有一种处理属性的标准方法:@AndyM,请看这里的情况不同,在运行操作结束时,内存会自动释放。只有一次调用loadAnim,每次加载帧都需要时间。先生,这个问题的最佳解决方案是什么?
-(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]];
}