程序收到信号:“EXC_BAD_ACCESS”

时间:2010-06-22 09:58:19

标签: cocoa-touch cocos2d-iphone dealloc

我正在使用cocos2d编写代码。 我想释放我分配的所有内存。我用以下方式在dealloc方法中完成了它  我发布的所有对象都在接口文件中声明,并且属性(assign)已设置并在实现文件中合成 我使用alloc方法创建它们,如

self.PlayerA = [[CCSprite alloc] initWithFile:@" PlayerImage_01.png"];


-(void)dealloc
{
 int count , i ;

 count = [self.PlayerA retainCount];
 for(i = 0; i < count; i++)
   [self.PlayerA release];

 count = [self.targetLayer retainCount];
 for(i = 0; i < count; i++)
   [self.targetLayer release];

  count = [self.playerGunSlowDrawSheet retainCount];
 for(i = 0; i < count; i++)
    [self.playerGunSlowDrawSheet release];

 count = [self.playerGunSlowDrawAnimation retainCount];
 for(i = 0; i < count; i++)
    [self.playerGunSlowDrawAnimation release];

 count = [self.numberFinishedTime retainCount];
 for(i = 0; i < count; i++)
    [self.numberFinishedTime release];

 count = [self.backGroundImage retainCount];
 for(i = 0; i < count; i++)
   [self.backGroundImage release];

 [[CCTextureCache sharedTextureCache] removeAllTextures];
 [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];

 [super dealloc];
 }

但我得到了:程序收到信号:“EXC_BAD_ACCESS”。 我调试它在[super dealloc];

显示错误

我在内存管理方面完全错了吗?或者我错过了这个。 谢谢。

1 个答案:

答案 0 :(得分:1)

是的,这不是释放对象的好方法。通过在dealloc方法中多次释放对象A(如果它保留计数> 1),您可能会从可能正在使用对象的任何其他对象下拉出地毯。

您应该只释放一次对象(假设您只保留一次对象或自己分配对象),如果您拥有它。

有关“拥有”对象的更多信息,建议您阅读Apple的内存管理编程指南:

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

一旦了解了Objective-C内存管理的基础知识,使用XCode的Build菜单中的Build and Analyze项应该有助于找到这样的问题

通常,dealloc方法应如下所示:

-(void) dealloc
{
    [self.objectA release];
    [self.objectB release];

    [super dealloc];
}

编辑:要回答关于为何获得EXC_BAD_ACCESS的原始问题,此处没有足够的信息来确定原因。一个可能的原因可能是您在子类中释放了一个对象,该对象在您的超类的dealloc方法中也被取消分配。但这只是黑暗中的一击