#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];
}