我使用以下方法在NSFileWrapper中取消对数据的解析,通常效果很好:
- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)p {
NSFileWrapper *wrapper = [self.fileWrapper.fileWrappers objectForKey:p];
if (!wrapper) {
NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", p);
return nil;
}
NSData *data = [wrapper regularFileContents];
NSKeyedUnarchiver *unarchiver;
@try {
unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
}
@catch (NSException *exception) {
NSLog(@"exception: %@", exception);
[TestFlight passCheckpoint:@"FILE LOADING EXCEPTION!"];
UIAlertView *alertOFF = [[UIAlertView alloc]
initWithTitle:@"Corrupt"
message:@"There was an error loading a file! Please contact m@meernotes.com"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertOFF show];
}
return [unarchiver decodeObjectForKey:@"data"];
}
然而,我偶尔会遇到线路unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
的SIGBUS崩溃。我想我的异常处理程序没有捕捉到这种类型的异常?我该如何处理这种例外情况,是什么原因造成的?
以下是Crashlytics崩溃报告:
Exception Type:SIGBUSCode:BUS_ADRALN
Thread 0 Crashed
Latest Crash: 11 September 2012 at 06:23
0 Foundation
-[NSKeyedUnarchiver initForReadingWithData:] + 389
1 Meernotes ✭ FRNBDocument.m line 221
-[FRNBDocument decodeObjectFromWrapperWithPreferredFilename:] + 221
2 Meernotes FRNBDocument.m line 155
-[FRNBDocument settings] + 155
3 Meernotes ModelController.m line 497
__39-[ModelController previewLoadDocAtURL:]_block_invoke_0 + 497
4
...
libdispatch.dylib
_dispatch_barrier_sync_f_slow_invoke + 78
5 libdispatch.dylib
_dispatch_main_queue_callback_4CF$VARIANT$up + 196
6 CoreFoundation
__CFRunLoopRun + 1268
7 CoreFoundation
CFRunLoopRunSpecific + 300
8 CoreFoundation
CFRunLoopRunInMode + 104
9 GraphicsServices
GSEventRunModal + 136
10 UIKit
UIApplicationMain + 1080
11 Meernotes main.m line 16
main + 16
首先,你确定这就是整个崩溃报告吗?应该有更多的细节。。。
无论如何,这也不例外。这是一个信号,通常意味着内存访问错误。如果您收到一个SIGBUS,它基本上意味着内存错误(通常是由于您的代码访问了一个坏指针)。
在您的情况下,最有可能的罪魁祸首是您从[wrapper regularFileContents]
接收的数据对象在某种程度上已损坏。最有可能的是,它的回报为零。
注意regularFileContents
:的文档
讨论
如果用户在您之后修改文件,则此方法可能返回nil调用readFromURL:options:error:或initWithURL:options:error:但是在NSFileWrapper读取文件内容之前。使用NSFileWrapperHeading立即读取选项可降低可能性关于这个问题。
那将是我的起点。也有可能是文件数据已损坏,并且未归档程序被坏数据阻塞。
基本上,这不是一个你可以抓住并忽略的例外。它表示您的程序中存在一个必须修复的错误。