我正在使用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];
显示错误我在内存管理方面完全错了吗?或者我错过了这个。 谢谢。
答案 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方法中也被取消分配。但这只是黑暗中的一击