【问题标题】:Program received signal: “EXC_BAD_ACCESS”节目接收信号:“EXC_BAD_ACCESS”
【发布时间】:2011-03-06 17:49:36
【问题描述】:

我正在使用 cocos2d 编写代码。 我想释放我分配的所有内存。我通过以下方式在 dealloc 方法中完成了它。
我发布的所有对象都在接口文件中声明,属性(分配)已设置并在实现文件中合成。
我使用 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] 处显示错误;

我的内存管理完全错了吗?或者我错过了什么。 谢谢。

【问题讨论】:

    标签: cocoa-touch cocos2d-iphone dealloc


    【解决方案1】:

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

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

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

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

    一旦您了解了 Objective-C 内存管理的基础知识,使用 XCode 的“构建”菜单中的“构建和分析”项应该有助于发现此类问题

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

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

    编辑:要回答关于为什么会获得 EXC_BAD_ACCESS 的原始问题,这里没有足够的信息来确定原因。一个可能的原因可能是您正在释放子类中的一个对象,该对象也在您的超类的 dealloc 方法中被释放。但这只是在黑暗中的一个镜头

    【讨论】:

    • 但是,我读到我们分配了多少次我们应该释放多少次的内存。所以,我做到了。我将通过您发布的链接。谢谢。
    • Srikanth - 是的,对象应该被“释放”的次数与它被“保留”(或分配)的次数一样多。但是,简单地重复释放一个对象会破坏引用计数的点 - 正如您本质上所说的“我不在乎它被引用了多少次,只需释放该对象使用的内存”。想象一下你有 A、B 和 Z 的情况。A 和 B 都引用 Z。你创建 Z,然后是 A,然后是 B。所以现在 Z 的引用计数是 2。然后说你释放 A,并导致它被释放。然后它将释放 Z 两次,并且 Z 将被释放。如果 B 然后尝试使用 Z,它将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多