Как освободить CCLayer

#iphone #xcode #memory-management #cocos2d-iphone #box2d

#iPhone #xcode #управление памятью #cocos2d-iphone #box2d

Вопрос:

Я создаю приложение box2d для iphone с использованием cocos2d. Я пытаюсь переключить свой CCLayer с моего HelloWorldLayer на мой HomeScene, и я получаю сообщение об ошибке «Поток 1: программа получила сигнал: «EXC_BAD_ACCESS».» Это выдает мне эту ошибку, когда я пытаюсь вызвать [super dealloc] в моем методе dealloc для моего HelloWorldLayer. Пожалуйста, помогите. Вот мои .h и .mm

 @interface HelloWorldLayer : CCLayer
{
    b2World *world;
    Cannon *cannon1;
    Cannon *cannon2;
    Cannonball *cannonball1;
    Cannonball *cannonball2;
    float theMass;
    float theMass2;
    CCSprite *sunBack;
    b2Vec2 cannon1Pos;
    b2Vec2 cannon2Pos;
    CCMenuItemSprite *pauseBut;
    CCMenuItemSprite *playBut;
    CCMenu *pauseMenu;
}
@property(nonatomic)b2Vec2 cannon1Pos;
@property(nonatomic)b2Vec2 cannon2Pos;

@property(nonatomic, retain)CCSprite *sunBack;
@property(nonatomic, retain)Cannon *cannon1;
@property(nonatomic, retain)Cannon *cannon2;
@property(nonatomic, retain)Cannonball *cannonball1;
@property(nonatomic, retain)Cannonball *cannonball2;
@property(nonatomic, retain)CCMenu *pauseMenu;

// returns a CCScene that contains the HelloWorldLayer as the only child
 (CCScene *) scene;
 (HelloWorldLayer *) sharedLayer;
-(void)createMonkeys;
-(void)restartGame;
-(void)playGame;
-(void)pauseGame;
-(CCSpriteBatchNode*)getSpriteBatch;
-(void)goToHome;

@end
  

Вот мой файл .mm, где я освобождаю

 // on "dealloc" you need to release all your retained objects
- (void) dealloc
{
    // in case you have something to dealloc, do it in this method
    delete world;
    world = NULL;
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
    [cannon1 removeFromParentAndCleanup:YES];
    [cannon2 removeFromParentAndCleanup:YES];
    [cannonball1 removeFromParentAndCleanup:YES];
    [cannonball2 removeFromParentAndCleanup:YES];

    // don't forget to call "super dealloc"
    [super dealloc];
}
  

Комментарии:

1. Вы вызываете release на своем слое? Многие объекты Cocos в значительной степени по умолчанию автоматически удаляются, поэтому, если вы вызовете, скажем, removeChild для своего слоя, я считаю, что этого должно быть достаточно, чтобы освободить его неявно.

Ответ №1:

Вы можете попробовать это вместо используемого вами dealloc

 -(void) dealloc
{
delete world;
world = NULL;
cannon1 = NULL;
cannon2 = NULL;
cannonball1 = NULL;
cannonball2 = NULL;
[super dealloc];
}