有没有办法捕获或处理EXC_BAD_ACCESS?

时间:2013-04-24 20:57:11

标签: iphone ios objective-c exc-bad-access

据我了解,当你试图访问不良内存时会发生EXC_BAD_ACCESS(如果我错了,请随时纠正我)?

有没有办法像try-catch中的Java一样抓住它来防止应用失败?

4 个答案:

答案 0 :(得分:24)

都能跟得上; EXC_BAD_ACCESS意味着事情已经过去了。您的程序正在尝试访问无效的内存地址。即内存已损坏,无法预测恢复。

这可能是内存管理问题。如果您可以重现该问题,请启用NSZombies并查看会发生什么。或者在这里发布回溯。

请注意,try-catch样式异常在iOS / Cocoa中也是不可恢复的。异常不能用于可恢复的错误处理。这就是NSError的用途。

答案 1 :(得分:3)

您可以有时使用信号处理程序在main中捕获它。但是,除了记录一些东西之外,不允许你做很多事情。

答案 2 :(得分:2)

可以使用try catch,但您首先需要知道导致问题的原因。您可以为当前版本启用NSZombie来捕获错误并消除需求。编辑当前方案,启用NSZombie。

  • 更新* Swift2 +现在具有出色的错误处理能力,绝对值得一试。 Swift Error Handling

答案 3 :(得分:1)

新的C库SignalRecovery可以使程序从诸如EXC_BAD_ACCESS之类的操作系统异常中恢复。 可以在IOS/MacOS/Linux中使用。

示例代码:

signal_try(label) {
    // Add your code need try.
    int* ptr = NULL;
    *ptr = 0;
}
signal_catch(label) {
    // Add your code to process exceptions, or do nothing.
    siginfo_t* info = signal_info();
}
signal_end(label)
// Continue run