在加载文件时捕获EXC_BAD_ACCESS的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在加载文件时捕获EXC_BAD_ACCESS的方法相关的知识,希望对你有一定的参考价值。

我正在使用UIDocument来加载文件。我现在已经损坏了一个文件,看看会发生什么以及我的应用程序的行为方式。它将与EXC_BAD_ACCESS崩溃,我现在想知道我应该如何处理这种情况。我只是希望文件永远不会被破坏?在UIDocument之前的日子里,我使用了@try和@catch来表示NSEXCEPTION,但这不适用于EXC_BAD_ACCESS。这是我会使用NSZOMBIE的情况吗?据我了解其他帖子,NSZombie仅用于调试目的,而不是你应该总是依赖的东西。如果我损坏了我的数据,下面是抛出EXC_BAD_ACCESS的代码行:

 -(BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError {

if (!_books) {
        _books = [[NSMutableArray alloc] init];
    }

        self.books = [NSKeyedUnarchiver unarchiveObjectWithData:contents]; // THIS WILL CRASH IF CONTENTS GOT CORRUPTED

        if ([_delegate respondsToSelector:@selector(libraryDocumentUpdated:)]) {
            [_delegate libraryDocumentUpdated:self];
        }

        return YES;
    }

谢谢你的任何建议。

答案

EXEC_BAD_ACCESS不是您捕获的异常,它告诉您正在访问无效的内存地址,从而导致崩溃。 NSZombies只是一种方法,可以保留所有应该被释放的对象“活着”(因此不会释放它们占用的内存,这显然不是你想要的版本),以便告诉你哪个“已经解除分配”你是消息。您需要弄清楚为什么要获得EXEC_BAD_ACCESS。书籍是保留财产吗?

另一答案

您应该找出崩溃的根本原因并进行修复。如果你真的想要捕获EXC_BAD_ACCESS,你可以。新的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

以上是关于在加载文件时捕获EXC_BAD_ACCESS的方法的主要内容,如果未能解决你的问题,请参考以下文章

EXC_BAD_ACCESS 重新加载带有文本字段的单元格

加载 AVPlayer 时出现错误线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

加载 .NET WinForm 应用程序 user.config 文件时如何捕获异常?

从 UITableView 委托方法中访问实例变量时获取“EXC_BAD_ACCESS”

从文本文件加载 Json 对象 - 返回未捕获的语法错误:意外标记“[”

尝试访问托管对象属性时的 EXC_BAD_ACCESS