有没有办法阻止EXC_BAD_ACCESS
崩溃应用程序,就像@[email protected]
一样,您可以优雅地处理异常。如何防止EXC_BAD_ACCESS崩溃应用程序?
更新:
当它试图取消引用一个无效的指针的代码崩溃。这是第三方库,它与外部硬件连接,因此我无法在本地进行调试。我试图阻止它崩溃并将数据输出到我的应用程序的调试控制台。
有没有办法阻止EXC_BAD_ACCESS
崩溃应用程序,就像@[email protected]
一样,您可以优雅地处理异常。如何防止EXC_BAD_ACCESS崩溃应用程序?
更新:
当它试图取消引用一个无效的指针的代码崩溃。这是第三方库,它与外部硬件连接,因此我无法在本地进行调试。我试图阻止它崩溃并将数据输出到我的应用程序的调试控制台。
在ObjC中,try/catch不处理异常特别优雅。您仍然会泄漏内存并使系统处于未定义状态。除了罕见的例外情况,期望的是,您只需简单地捕捉,以便在崩溃之前记录一些事情。一般来说,您不应该在程序的顶层使用@catch
来达到此目的。在有些情况下,有限的例外情况可能适用,但在ObjC中很少见。有关更多信息,请参阅Exception Programming Guide。见特别是从ObjC ARC documentation如下:
标准可可约定是异常信号程序员的错误,并且不打算从恢复。使代码异常在缺省情况下是安全的,会对通常实际上不关心异常安全的代码施加严重的运行时和代码大小惩罚。因此,ARC生成的代码在异常时会默认泄漏,如果进程立即终止,这就好了。关心从异常中恢复的程序应该启用选项[-fobjc-arc-exceptions,它会对程序施加速度和内存损失]。
EXC_BAD_ACCESS
也是如此。您可以用信号处理程序捕捉它,以便记录一些信息,然后完成您的崩溃。有关这样做的好工具,请参阅PLCrashReporter。要正确编写这样的处理程序非常困难,所以我强烈建议使用现有的框架。如果您错误地捕获了EXC_BAD_ACCESS
,则可能很容易陷入导致用户电池耗尽的死锁。
您可以重写代码以避免出现这些错误。尽量不要引用任何空指针,并保持对你想要访问的任何对象的引用。
经常因为您发送消息给发布的对象而得到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
This!一些错误,你真的不想尝试并继续:-) – paxdiablo 2013-03-20 02:02:27
+1只需在编程时谨慎小心,保持严格的一致性(特别是使用访问器而不是ivars),并使用“将警告视为错误”,我发现这些类型的崩溃变得非常罕见。 – 2013-03-20 02:16:55
感谢您的建议,但它不是我的代码。这是第三方库代码,我正在尝试远程调试。我无法使用Xcode进行调试,因为它与外部硬件连接。我问这个问题是有原因的。 – Boon 2013-03-20 02:44:53