1

複数のレベルを持つ box2d-cocos2d ゲームがあります。私のレベルは、別のクラスから継承された Box2d 機能を使用するレイヤーです。たとえば、最初のレイヤーは次のようになります。

Level1Layer : Box2DLevel : Box2DLayer : CCLayer : CCNode : NSObject

私の問題は、レイヤーが必要なときに解放されないことです。たとえば、次のコードでレベルを再生すると:

[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:0.5f scene:[[self class] node]]];

次に、メモリフットプリントが増加します。メニューのような円がある場合にも同じことが起こります->レベル1->メニュー->レベル1で、メモリ不足のためにしばらくするとアプリがクラッシュします.NSLogsでdeallocメソッドを追跡しました、しかし、シーンを置き換えると、すべての dealloc メソッドが呼び出されます。私のログは次のようになります。

*** DEALLOC ***<Level1Layer = 0x1cdcfe70 | Tag = -1>
2013-08-26 12:05:57.089 Myapp[6334:907] 
***BOX2DLEVEL DEALLOC ***<Level1Layer = 0x1cdcfe70 | Tag = -1>
2013-08-26 12:05:57.093 Myapp[6334:907] ***BOX2DLAYER DEALLOC ***
<Level1Layer = 0x1cdcfe70 | Tag = -1> 

iPhone 4 で 3 つのレベルをプレイした後にアプリがクラッシュするため、私は本当に行き詰まっています。どうすればこの問題を解決できますか? 解決策と指針をいただければ幸いです。

レベル 1 の解放:

-(void)dealloc{
    NSLog(@"\n*** DEALLOC ***%@",self);
    [self removeAllChildrenWithCleanup:YES];
    [super dealloc];
}

Box2dLevel 解放:

-(void) dealloc{
    NSLog(@"\n***BOX2DLEVEL DEALLOC ***%@",self);
    [self removeChild:_label cleanup:YES];
    [self removeChild:labelForCoins cleanup:YES];
    [self removeChild:labelForTime cleanup:YES];
    [self removeChild:freezeCountDown cleanup:YES];
    [self removeChild:freezedMask cleanup:YES];
    [self removeChild:_backGround cleanup:YES];
    [self removeChild:darkLayer cleanup:YES];
    [self removeChild:flashlayer cleanup:YES];
    [self removeChild:skillsMenu cleanup:YES];
    [arrayForObjects release];
    [skillsMenuArray release];
    [super dealloc];
}

Box2dLayer の割り当て解除:

-(void) dealloc
{
    NSLog(@"***BOX2DLAYER DEALLOC ***\n%@",self);
    if (debugDraw) {
        delete debugDraw;
        debugDraw = NULL;
    }
    if (mouseJoint) {
        world->DestroyJoint(mouseJoint);
        mouseJoint = NULL;
    }
    if (groundBody) {
        world->DestroyBody(groundBody);
        groundBody = NULL;
    }
    if (referenceBody) {
        world->DestroyBody(referenceBody);
        referenceBody = NULL;
    }
    if (bombSensor) {
        world->DestroyBody(bombSensor);
        bombSensor = NULL;
    }
    if (laserSensor) {
        world->DestroyBody(laserSensor);
        laserSensor = NULL;
    }
    if (_contactListener) {
        free(_contactListener);
        _contactListener = NULL;
    }
    [self removeChild:_obj cleanup:YES];
    [super dealloc];
    NSLog(@"\n***Box2dLayer superclass deallocated");
4

1 に答える 1

0

[Level1layer scene]代わりに使用してみてください[[self class] node](サンプルプロジェクトでもそうです)

于 2013-09-11T21:44:30.663 に答える