2

通常は非常にうまく機能する次の方法で、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"];
}

ただし、回線の SIGBUS クラッシュが時々発生しますunarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];。このタイプの例外は、私の例外ハンドラーによってキャッチされていないと思いますか? このような例外に対処するにはどうすればよいですか?また、その原因は何ですか?

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
4

1 に答える 1

1

まず、それがクラッシュ レポート全体でよろしいですか? もう少し詳細があるはずです...

とにかく、それは例外ではありません。これは信号であり、通常はメモリ アクセス エラーを意味します。SIGBUS を受け取った場合、それは基本的にメモリ エラーを意味します (通常はコードが不正なポインタにアクセスしたことによるものです)。

あなたの場合、最も可能性の高い原因は、受け取ったデータ オブジェクト[wrapper regularFileContents]が何らかの形で破損していることです。ほとんどの場合、nil が返されます。

のドキュメントに注意してくださいregularFileContents

討論

readFromURL:options:error: または initWithURL:options:error: を呼び出した後で、NSFileWrapper がファイルの内容を読み取る前に、ユーザーがファイルを変更した場合、このメソッドは nil を返すことがあります。NSFileWrapperReadingImmediate 読み取りオプションを使用して、その問題の可能性を減らします。

それが私が始めるところです。ファイル データが破損している可能性もあり、アンアーカイバーが不良データで窒息している可能性もあります。

基本的に、これはキャッチして無視できる例外ではありません。これは、修正が必要なプログラムのバグを示しています。

于 2012-09-11T10:31:59.627 に答える