0

私は cocos2d 2.0 を使用しましたが、スプライト アニメーションが切り替わったときにクラッシュすることが観察されました。ここにコードがあります

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

}

//ケース 1: 2 回目の再生でクラッシュ

-(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: クラッシュは発生しないが、メモリ リークが発生する… (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 を呼び出しますか? アクションは 1 回限りのオブジェクトだからです。アクションが終了すると、それ自体が解放されます。アクションを再度作成する必要があります。

アクションの保持を推奨する前述の「ベスト プラクティス」には従わないでください。アクションの内部動作 (コードなど) を知らなければ、すべてのアクションをそのように再利用できるわけではないため、メモリ リークやクラッシュが発生するリスクがあるため、これは悪い習慣です。

于 2012-10-22T17:41:02.037 に答える