1

我正在构建一个 Cocos2D 游戏,在其中两个特定精灵发生碰撞后(通过简单的边界框技术),我调用

[[CCDirector sharedDirector] replaceScene:gameOverScene];

切换到游戏结束场景。

一旦它使用其中的所有内容初始化游戏结束场景,游戏就会崩溃并在类中转到此方法ccArray.m

void ccArrayRemoveAllObjects(ccArray *arr) { while( arr->num > 0 ) CC_ARC_RELEASE(arr->arr[--arr->num]); }

带有消息: 线程 1:程序接收到的信号:“EXC_BAD_ACCESS”。

我尝试使用断点进行调试,发现一旦我的 gameOver 场景被初始化并准备好显示,dealloc前一个类(游戏类,称为替换场景)中的方法被调用,之后它会抛出此错误。

我的update方法:

-(void)update:(ccTime)dt {

if (CGRectIntersectsRect(plane.boundingBox, enemy.boundingBox)) {
CCScene *gameOverScene = [GameOverLayer sceneWithWon:NO]; [[CCDirector sharedDirector] replaceScene:gameOverScene]; } }

我的dealloc方法:

- (void) dealloc {

[super dealloc];

[_monsters release];
_monsters = nil;
[mole release];
mole = nil;
[text release];
text = nil;
[mBG1 release];
mBG1 = nil;
[mBG2 release];
mBG2 = nil; }

我不知道为什么会这样。请帮忙。

感谢你在期待。

4

2 回答 2

1

在释放游戏场景之前,您正在调用 super 的 dealloc。在你的 dealloc 方法结束时调用 super 的 dealloc :

- (void) dealloc {   
   [_monsters release];
   _monsters = nil;
   [mole release];
   mole = nil;
   [text release];
   text = nil;
   [mBG1 release];
   mBG1 = nil;
   [mBG2 release];
   mBG2 = nil; 

   [super dealloc];
}

当您dealloc第一次调用 super 时,您正在释放您的实例,使其成员无效,因此在之后访问它们dealloc将产生内存错误访问问题

于 2013-08-18T13:33:45.343 回答
1

因为你没有显示足够的代码,我只能猜测其中一些对象,例如_monsters,mole,text,mBG1,mBG2,在你在dealloc函数中释放它们之前就被自动释放了。所以,它们不能再释放了.这是你应该知道的ARC自动引用计数,它是ios的基础。只试试这个:

- (void) dealloc {

    [super dealloc];

}
于 2013-10-29T19:14:52.640 回答