複数のレベルを持つ 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");