2011-07-13 8 views
1

私の@Monsterクラスには、3種類のウォークアニメーションがあります。CCAnimationとCCAnimateリーク?

"Monster.h"

@interface Monster : CCSprite{ 
    CCAction *fWalk; 
    CCAction *bWalk; 
    CCAction *hWalk; 
} 
@property (nonatomic, retain) CCAction *fWalk; 
@property (nonatomic, retain) CCAction *bWalk; 
@property (nonatomic, retain) CCAction *hWalk; 

"Monster.m"

+ (id) monsterInit... 
{ 
    Monster *sprite = ...// initialization 

    NSMutableArray *frameArray = [NSMutableArray array]; 
    for (int i = 0; i < 3; i++) { 
     NSString *fileName = [NSString stringWithFormation:@"%d.png", i]; 
     [frameArray addObject[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:fileName]]; 
    } 
    CCAnimation *walk = [CCAnimation animationWithFrames:frameArray delay:0.1f]; 
    self.fWalk = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walk restoreOriginalFrame:NO]]; 

    [frameArray removeAllObjects]; 
    for (int i = 3; i < 6; i++) { 
     NSString *fileName = [NSString stringWithFormation:@"%d.png", i]; 
     [frameArray addObject[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:fileName]]; 
    } 
    walk = [CCAnimation animationWithFrames:frameArray delay:0.1f]; 
    sprite.bWalk = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walk restoreOriginalFrame:NO]]; 

    [frameArray removeAllObjects]; 
    for (int i = 6; i < 9; i++) { 
     NSString *fileName = [NSString stringWithFormation:@"%d.png", i]; 
     [frameArray addObject[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:fileName]]; 
    } 
    walk = [CCAnimation animationWithFrames:frameArray delay:0.1f]; 
    sprite.hWalk = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walk restoreOriginalFrame:NO]]; 

    return sprite; 
} 

- (void) dealloc 
{ 
    [fWalk release]; 
    [bWalk release]; 
    [hWalk release]; 

    [super dealloc]; 
} 

私は、パフォーマンスツールで、このアプリを実行すると - 漏れ。 "CCAnimation * walk ..."、 "self.fWalk ..."、 "walk = ..."、 "self.bWalk ..."、 "walk = ..."、 "self" .hWalk .. "はメモリリークを引き起こします。

私はCCAnimationとCCAnimateについてソースコードをチェックしましたが、それらはすべて "autorelease"です。なぜこのリークが起こったのか分かりません。 何をすべきか考えていますか?

答えて

2

アクションは、actionWithActionメソッドで作成したときに自動リリースされるため、後で使用する場合は保持する必要があります。

そうでなければ、あなたのモンスタークラスはアクションを所有しておらず、initメソッドを離れるときにオートレリースされます。

1

[OK]をしかし、あなたは、このような配列にすべてのアニメーションを保存します。

CCAnimation *anim = [CCAnimation animationWithSpriteFrames:animFrames delay:pDelay]; 
CCAnimate *animate = [CCAnimate actionWithAnimation:anim]; 
CCCallFunc *callback = [CCCallFunc actionWithTarget:pTarget selector:pCallBack]; 
CCSequence *seq = [CCSequence actions:animate, callback , nil]; 

NSMutableDictionary *animations; 

[animations setValue:seq forKey:pName]; 

- (void)dealloc { 
    for (NSString* key in [animations allKeys]) { 
     CCAction *action = [animations objectForKey:key]; 
     [self stopAction:action]; 
     [action stop]; 
    } 

    [animations removeAllObjects]; 
    //[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames]; 
} 

CCAnimationがリリースされていません...