在加载文件时捕获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的方法的主要内容,如果未能解决你的问题,请参考以下文章
加载 AVPlayer 时出现错误线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
加载 .NET WinForm 应用程序 user.config 文件时如何捕获异常?
从 UITableView 委托方法中访问实例变量时获取“EXC_BAD_ACCESS”