3

iCloudドキュメントストレージを使用した非常にシンプルなIOSアプリがあります。すべてが機能していましたが、ある時点で、少なくとも 1 つの iCloud ドキュメントのドキュメント ロード メソッドで EXC_BAD_ACCESS エラーが発生し始めましたが、ほとんどのファイルは問題なくロードされます。

- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {

    file = (NSFileWrapper*) contents;

    NSFileWrapper *infoFile = [[file fileWrappers] objectForKey:InfoFile];
    NSData *infoData = [infoFile regularFileContents];

    if(nil != infoData) {

        NSPropertyListFormat format = NSPropertyListBinaryFormat_v1_0;
        NSError *propertyListError;

        // EXC_BAD_ACCESS occurs here
        NSDictionary *dictionary = [NSPropertyListSerialization propertyListWithData:infoData options:NSPropertyListImmutable format:&format error:&propertyListError];

        if(nil == propertyListError) {

            _name = [dictionary objectForKey:@"name"];
            _date = [dictionary objectForKey:@"date"];
            _index = [dictionary objectForKey:@"index"];
            _paperSize = [GritzPaperSizeEnum enumWithType:[dictionary objectForKey:@"paperSize"]];

            TFLog(@"loading doc %@", _name);

            _pages = [[NSMutableArray alloc] init];

            for (NSString *key in file.fileWrappers) {

                NSFileWrapper *subDir = [[file fileWrappers] objectForKey:key];

                if(subDir.isDirectory) {
                    GritzPage *page = [[GritzPage alloc] initFromFile:subDir];
                    [_pages addObject:page];
                }
            }

            _currentPage = [_pages objectAtIndex:0];

            return YES;
        }
    }

    return NO;
}

ここに画像の説明を入力

不良データを「キャッチ」して処理し、破損したファイルを無視できると期待しています。しかし、私は方法を理解できないようです。EXC_BAD_ACCESS エラーにより、アプリがクラッシュします。

データまたはファイルが失敗してスキップ (または削除) することを事前に判断するには、どうすればよいでしょうか。

4

2 に答える 2

1

それが isKindOfClass を使用して NSFileWrapper であることを確認します。


@try { .. } @catch コンストラクトを使用して例外をキャッチしても、この場合は機能しませんが、UNIX SIGNAL である BAD_ACCESS が発生するためです。

于 2012-12-16T17:22:53.983 に答える
0

NSPropertyListFormat 変数形式は、ポイントとして宣言する必要があります。そして、 formatのアドレスではなく、ポインタとして format を使用して propertyListWithData: Method を呼び出す必要があると思います。

于 2013-01-30T13:28:51.810 に答える