几天来我一直在尝试解决这个问题,但没有运气。
我有一个通过 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。
显然,我首先想弄清楚是什么导致了损坏,但是我怎样才能确定数据是否无效,以便应用程序不会崩溃?