我通常是 iPhone 开发和 Xcode 的新手,不知道如何开始对 EXC_BAD_ACCESS
信号进行故障排除。如何让 Xcode 在导致错误的确切行中断?
我似乎无法让 Xcode 在导致问题的行上停止,但我确实在调试控制台中看到以下行:
Sun Oct 25 15:12:14 jasonsmacbook TestProject[1289] : CGContextSetStrokeColorWithColor: invalid context
Sun Oct 25 15:12:14 jasonsmacbook TestProject[1289] : CGContextSetLineWidth: invalid context
Sun Oct 25 15:12:14 jasonsmacbook TestProject[1289] : CGContextAddPath: invalid context
Sun Oct 25 15:12:14 jasonsmacbook TestProject[1289] : CGContextDrawPath: invalid context
2009-10-25 15:12:14.680 LanderTest[1289:207] *** -[CFArray objectAtIndex:]: message sent to deallocated instance 0x3c4e610
现在,我正在尝试绘制从 UIGraphicsGetCurrentContext()
检索到的上下文并传递给我想要绘制的对象。
进一步的试验和错误调试,我发现我在我的类(class)上有一个属性的 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 方法中设置属性感到困惑。对于哪种方式最好,似乎没有共识。
最佳答案
对于任何 EXC_BAD_ACCESS 错误,您通常会尝试向已释放对象发送消息。 最佳方法是使用 NSZombieEnabled .
这是通过从不实际释放对象来实现的,而是将其包装为“僵尸”并在其中设置一个标志,表明它通常会被释放。这样,如果您再次尝试访问它,它仍然知道您出错之前是什么,并且通过这些信息,您通常可以回溯以查看问题所在。
当调试器有时会发现任何有用的信息时,它尤其有助于后台线程。
非常重要的注意事项但是,您需要 100% 确保这仅在您的调试代码中,而不是在您的分发代码中。因为什么都没有发布,所以你的应用程序会泄漏、泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的 appdelegate 中:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
如果您需要帮助找到确切的行,请执行构建和调试 (CMD-Y) 而不是构建和运行 (CMD-R )。当应用程序崩溃时,调试器会准确显示哪一行,结合 NSZombieEnabled,您应该能够准确找出原因。
关于iphone - 在 Xcode 中打破 EXC_BAD_ACCESS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1622079/