3

几天来我一直在尝试解决这个问题,但没有运气。

我有一个通过 iCloud 同步的 UIDocument,这里是方法

- (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {

    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:name forKey:@"name"];
    [archiver encodeObject:note forKey:@"note"];
    [archiver finishEncoding];
    return data;
}

- (BOOL)loadFromContents:(NSData *)contents ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
    NSLog(@"%@", [contents bytes]);
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:contents];
    name = [unarchiver decodeObjectForKey:@"name"];
    note = [unarchiver decodeObjectForKey:@"note"];
    [unarchiver finishDecoding];

    return YES;
}

正如你所看到的,我在内容上做了一个 NSLog,大多数时候,一切都很好。它可以正确加载,但是当数据损坏时,即使只是执行 NSLog,我也会得到 EXC_BAD_ACCESS。

不知何故,无处不在的容器中的数据被破坏了,但是它不会传播到其他设备,所有其他设备都会很好地加载内容。从设备中删除应用程序并不能修复它。只有当我将文档重新保存在另一台设备上时,它才能正常工作。我正在使用ARC,所以这不应该是问题。我检查了返回 true 的 NSURLUbiquitousItemIsDownloadedKey。

显然,我首先想弄清楚是什么导致了损坏,但是我怎样才能确定数据是否无效,以便应用程序不会崩溃?

4

0 回答 0