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

问题描述 投票:2回答:2

我正在使用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;
    }

谢谢你的任何建议。

iphone objective-c cocoa-touch ios5 icloud
2个回答
1
投票

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


0
投票

您应该找出崩溃的根本原因并进行修复。如果你真的想要捕获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
© www.soinside.com 2019 - 2024. All rights reserved.