【发布时间】:2010-12-09 23:23:31
【问题描述】:
我是 iPhone 开发和 Xcode 的新手,不知道如何开始对 EXC_BAD_ACCESS 信号进行故障排除。如何让 Xcode 在导致错误的确切行中断?
我似乎无法让 Xcode 在导致问题的行上停止,但我确实在调试控制台中看到以下行:
10 月 25 日星期日 15:12:14 测试项目[1289]: CGContextSetStrokeColorWithColor: 无效的上下文
10 月 25 日星期日 15:12:14 测试项目[1289]: CGContextSetLineWidth: 无效的上下文
10 月 25 日星期日 15:12:14 测试项目[1289]: CGContextAddPath: 无效的上下文
10 月 25 日星期日 15:12:14 测试项目[1289]: CGContextDrawPath: 无效的上下文
2009-10-25 15:12:14.680 LanderTest[1289:207] *** -[CFArray objectAtIndex:]: 消息发送到 释放实例 0x3c4e610
现在,我正在尝试绘制从 UIGraphicsGetCurrentContext() 检索到的上下文并传递给我想要绘制的对象。
进一步的试错调试,我发现NSMutableArray 我的班级有一个属性是一个僵尸。我进入了课程的init 函数,这是我使用的代码:
if ((self = [super init])) {
NSMutableArray *array = [NSMutableArray array];
self.terrainBlocks = array;
[array release];
}
return self;
}
我删除了[array release] 行,它不再给我EXC_BAD_ACCESS 信号,但我现在对它为什么起作用感到困惑。我认为当我使用该属性时,它会自动为我保留它,因此我应该从init 中释放它,这样我就不会泄漏。我对它的工作原理感到非常困惑,我读过的所有指南和 Stackoverflow 问题只会让我更加困惑如何在我的 init 方法中设置属性。对于哪种方式最好,似乎没有共识。
【问题讨论】:
-
不管怎样,在 SO(或 Google)上搜索该错误并不会完全显示为空...stackoverflow.com/search?q=exc_bad_access
-
FWIW,我进行了搜索,但没有找到任何帮助我让 XCode 停止在导致
EXC_BAD_ACCESS的行上的东西。即使在打开 NSZombieEnabled 和 Build and Debug 之后,XCode 也没有显示导致错误的行。 -
稍微相关:stackoverflow.com/questions/1027658/… 基本相同的错误,但感谢 NSTimer。
-
该属性是
retained 吗?如果是,你应该release,如果不是,你不应该。 -
Pål,他不应该,因为无论哪种方式,
[NSMutableArray array]都会返回一个自动释放的NSMutableArray实例,所以你不必担心它的内存管理。
标签: iphone objective-c xcode debugging exc-bad-access