UIDocument loadFromContents因EXC_BAD_ACCESS而失败

时间:2012-12-16 16:13:24

标签: ios icloud uidocument

我有一个使用iCloud文档存储的非常简单的IOS应用程序。一切正常,然后在某些时候我开始在我的文档加载方法中遇到至少一个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;
}

enter image description here

我希望我能“抓住”并处理坏数据并忽略损坏的文件;但我似乎无法弄清楚如何。 EXC_BAD_ACCESS错误导致应用程序崩溃。

我应该做些什么来提前确定数据或文件将会失败并跳过它(或删除它)。

2 个答案:

答案 0 :(得分:1)

使用isKindOfClass验证它是NSFileWrapper,否则将其视为一个很奇怪(也请查看给定的typeName :))


使用@try {..} @catch构造来捕获任何异常在这种情况下都不会起作用,因为你导致一个BAD_ACCESS是一个UNIX SIGNAL

答案 1 :(得分:0)

NSPropertyListFormat变量格式应声明为point。我认为你应该调用propertyListWithData:Method,格式为指针而不是 format 的地址。