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

时间:2011-11-12 19:11:45

标签: iphone objective-c cocoa-touch ios5 icloud

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

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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