iphone - 在 Xcode 中打破 EXC_BAD_ACCESS?

标签 iphone objective-c xcode debugging exc-bad-access

我通常是 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/

相关文章:

iphone - iPhone(iOS5)上的 PyObjC 坏了?

ios - iCarousel 上的缩放变换显示屏幕外区域

ios - UITableView 数据源必须从 tableView : cellForRowAtIndexPath 返回一个单元格

iphone - 在 Xcode 中制作 iPhone 应用程序时,如何制作应用程序图标而不让手机添加默认的玻璃效果眩光?

iphone - 我可以将在 xcode 中创建的 iPhone 应用程序变成 Web 应用程序吗?

iphone - UITableViewController 背景图片拉伸(stretch)

iphone - 如何在 Swift 中使用 CoreData 获取 n 天前的项目?

iphone - 未找到 CATransform3DMakeRotation 符号

iPhone 内存不足,奇怪地崩溃

ios - swift 的部分 pagecurl 动画