首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Xcode中中断EXC_BAD_ACCESS?

在Xcode中中断EXC_BAD_ACCESS?
EN

Stack Overflow用户
提问于 2009-10-25 21:11:49
回答 9查看 58K关注 0票数 46

我是iPhone开发和Xcode的新手,我不知道如何开始对EXC_BAD_ACCESS信号进行故障排除。如何才能使Xcode在导致错误的确切行处中断?

我似乎无法让Xcode停止在引起问题的行上,但我确实在调试控制台中看到了以下行:

太阳报10月25日15:12:14 jasonsmacbook TestProject1289 : CGContextSetStrokeColorWithColor:无效上下文 太阳报10月25日15:12:14 jasonsmacbook TestProject1289 : CGContextSetLineWidth:无效上下文 太阳报10月25日15:12:14 jasonsmacbook TestProject1289 : CGContextAddPath:无效上下文 太阳报10月25日15:12:14 jasonsmacbook TestProject1289 : CGContextDrawPath:无效上下文 2009-10-25 15:12:14.680 LanderTest1289:207 * -CFArray objectAtIndex::message发送给解除分配的实例0x3c4e610

现在,我试图绘制到从UIGraphicsGetCurrentContext()检索的上下文,并传递给我想要使用的对象。

进一步的尝试和错误调试,我发现我在类中有一个属性的NSMutableArray是一个僵尸。我进入了该类的init函数,下面是我使用的代码:

代码语言:javascript
运行
复制
if ((self = [super init])) {
        NSMutableArray *array = [NSMutableArray array];
        self.terrainBlocks = array;
        [array release];
    }
    return self;    
}

我删除了[array release]行,它不再给我EXC_BAD_ACCESS信号,但我现在很困惑为什么会这样做。我认为当我使用这个属性时,它会自动为我保留它,因此我应该从init内部释放它,这样我就不会有泄漏了。我完全不明白这是如何工作的,以及我所读过的所有指南和堆栈溢出问题,只是更多地混淆了如何在init方法中设置属性。关于哪一种方式是最好的,似乎没有达成共识。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-10-25 21:15:46

对于任何EXC_BAD_ACCESS错误,通常都试图向已释放的对象发送消息。跟踪这些数据的最佳方法是使用NSZombieEnabled

这样做的方法是永远不实际释放一个对象,而是将其包装成一个“僵尸”,并在其中设置一个标志,表明它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前它是什么,并且使用这个小信息,您通常可以回溯查看问题是什么。

当调试器有时会删除任何有用的信息时,它在后台线程中尤其有帮助。

非常重要,但是要注意的是,您需要100%地确保只在调试代码中,而不是在发行版代码中。因为什么都没有发布,你的应用程序会泄漏,泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的应用程序委托中:

代码语言:javascript
运行
复制
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

如果您需要帮助找到确切的行,请执行编译和调试(CMD-Y),而不是构建和运行(CMD-R)。当应用程序崩溃时,调试器将向您显示具体的行以及与NSZombieEnabled的结合,您应该能够确切地了解原因。

票数 84
EN

Stack Overflow用户

发布于 2009-10-25 23:04:09

关于你的阵列。线

代码语言:javascript
运行
复制
NSMutableArray *array = [NSMutableArray array];

实际上不会给您提供保留的对象,而是自动释放对象。它可能会保留在下一行,但是您不应该在第三行中释放它。请参阅

这是基本规则: 如果使用名称以“alloc”或“new”开头或包含“复制”(例如,alloc、newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则可以获得对象的所有权。您有责任放弃您所拥有的使用版本或自动发布的对象的所有权。任何其他时候,当你收到一个对象,你不能释放它。

票数 17
EN

Stack Overflow用户

发布于 2011-11-10 12:37:08

在Xcode 4中,您可以通过单击Project下拉(左上角,右边的停止按钮) ->编辑->诊断选项卡->启用僵尸对象来启用僵尸。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1622079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档