有没有办法阻止EXC_BAD_ACCESS
崩溃应用,例如@try..@catch
你可以优雅地处理异常。
更新
代码在尝试取消引用无效指针时崩溃。这是第三方库,它与外部硬件接口,因此我无法在本地调试。我试图阻止它崩溃并将数据输出到我的应用程序上的调试控制台。
答案 0 :(得分:14)
在ObjC中,try / catch不会特别优雅地处理异常。您仍将泄漏内存并使系统处于未定义状态。除了罕见的例外,期望你只是捕捉,所以你可以在崩溃之前记录一些东西。一般而言,您不应该在任何地方使用@catch
,而是在程序的顶层用于此目的。在某些特殊情况下,例外的使用有限,但在ObjC中很少见。有关更多信息,请参阅Exception Programming Guide。请参阅ObjC ARC documentation中的以下内容:
标准的Cocoa约定是异常信号程序员错误,并不打算从中恢复。默认情况下使代码异常安全会对通常实际上并不关心异常安全的代码施加严格的运行时和代码大小惩罚。因此,ARC生成的代码默认情况下会在异常时泄漏,如果要立即终止进程,这很好。关注从异常中恢复的程序应该启用选项[-fobjc-arc-exceptions,它会对你的程序施加速度和内存惩罚]。
EXC_BAD_ACCESS
也是如此。您可以使用信号处理程序捕获它,以便记录一些信息,然后完成崩溃。有关这样做的好工具,请参阅PLCrashReporter。正确编写这样的处理程序非常困难,所以我强烈建议使用现有的框架。如果你错误地发现EXC_BAD_ACCESS
,你很容易陷入耗尽用户电池的死锁。
答案 1 :(得分:11)
您经常获得EXC_BAD_ACCESS
,因为您向已发布的对象发送了一条消息。然后你可以检查NSZombie
。什么是NSZombie?您可以看到:this。它会抓住
EXC_BAD_ACCESS
因为向已发布的对象发送了一条消息。
您可以像这样设置NSZombie:查看Enable Zombie Objects
你也可以得到EXC_BAD_ACCESS
,因为内存警告级别太高,或者你的内存太高,所以苹果会关闭你的应用程序。这EXC_BAD_ACCESS
太难以阻止了。我认为唯一的方法是尽可能低地管理你的记忆,有时你可以看到日志在哪里receive memory warning
,当等级很高时,可能会得到EXC_BAD_ACCESS
答案 2 :(得分:8)
您可以重写代码以避免出现这些错误。尽量不要引用任何空指针,并保持对您想要访问的任何对象的引用。