我对 iPhone 开发和 Xcode 不太熟悉,不知道如何开始排除故障EXC_BAD_ACCESS
信号。如何让 Xcode 在导致错误的确切行处中断?
我似乎无法让 Xcode 在导致问题的线路上停止,但我确实在调试控制台中看到以下几行:
10 月 25 日星期日 15:12:14 jasonsmacbook
测试项目[1289]:
CGContextSetStrokeColorWithColor:
无效的上下文
10 月 25 日星期日 15:12:14 jasonsmacbook
测试项目[1289]:
CGContextSetLineWidth:无效上下文
10 月 25 日星期日 15:12:14 jasonsmacbook
测试项目[1289]:
CGContextAddPath:上下文无效
10 月 25 日星期日 15:12:14 jasonsmacbook
测试项目[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 方法中设置属性更加困惑。对于哪种方式最好似乎没有达成共识。
对于任何 EXC_BAD_ACCESS 错误,您通常尝试向已释放的对象发送消息。这BEST追踪这些的方法是使用NSZombie启用.
这是通过从不真正释放一个对象,而是通过将其包装为“僵尸”并在其中设置一个标志来表示它通常会被释放来实现的。这样,如果您尝试再次访问它,它仍然知道您犯错误之前的情况,并且通过这一点信息,您通常可以回溯以查看问题所在。
当调试器有时会放弃任何有用的信息时,它在后台线程中尤其有用。
非常重要的注意事项然而,您需要 100% 确保这仅出现在您的调试代码中,而不是您的分发代码中。因为没有任何东西被发布,所以你的应用程序将会泄漏、泄漏、泄漏。为了提醒我这样做,我将此日志放入我的应用程序委托中:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
如果您需要帮助找到确切的行,请执行构建和调试(CMD-Y) 而不是构建并运行 (CMD-R)。当应用程序崩溃时,调试器将准确地显示哪一行,并结合 NSZombieEnabled,您应该能够找出确切的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)