我正在使用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;
}
感谢您的任何建议。
答案 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