您好我正在使用iCloud支持我的应用程序并使用UIDocument
进行存储。我能够将数据保存到iCloud并首次获取相同内容。但是,当我在设备上删除并重新安装该应用时,使用EXC BAD ACCESS
尝试取消归档数据时似乎与NSKeyUnarchiver
一起崩溃。
代码。
BuyerDocument.m // UIDocument Subclass
// Accessor for BuyerData
- (BuyerData *)data {
if (_data == nil) {
if (self.fileWrapper != nil) {
self.data = [self decodeObjectFromWrapperWithPreferredFilename:BUYER_FILENAME]; // BUYER_FILENAME = @"buyer.data"
} else {
self.data = [[BuyerData alloc] init];
}
}
return _data;
}
- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)preferredFilename {
NSFileWrapper * fileWrapper = [self.fileWrapper.fileWrappers objectForKey:preferredFilename];
if (!fileWrapper) {
NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", preferredFilename);
return nil;
}
if([fileWrapper isRegularFile]){
NSLog(@"is regular wrapper");
}
NSData * data = [fileWrapper regularFileContents];
NSLog(@"data %@",data); // This logs successfully
// NSLog(@"data bytes %@",[data bytes]) // This also causes app to crash.
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; // App will crash here
return [unarchiver decodeObjectForKey:@"data"];
}
在此处加载BuyerDocument。
- (void)loadDocAtURL:(NSURL *)fileURL {
// Open doc so we can read metadata
BuyerDocument * doc = [[BuyerDocument alloc] initWithFileURL:fileURL];
[doc openWithCompletionHandler:^(BOOL success) {
.......
BuyerData * data = doc.data;
....
[doc closeWithCompletionHandler:^(BOOL success) {
.....
}];
}
BuyerData.m
#define kVersionKey @"Version"
#define kNameKey @"Name"
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeInt:1 forKey:kVersionKey];
[encoder encodeObject:self.name forKey:kNameKey];
}
- (id)initWithCoder:(NSCoder *)decoder {
[decoder decodeIntForKey:kVersionKey];
NSString *nameData = [decoder decodeObjectForKey:kNameKey];
// NSLog(@">>>>>>>>>>>>>>>>>>> %@",name); // This logs for first 2-3 files and then crash occurs
return [self initWithName:nameData];
}
正如我所说,当我第一次添加数据时,一切运行正常,只有在删除并重新安装后才开始发生崩溃。此崩溃发生前,还会先获取3-4个名称并显示在tableview中。
试过this但没有任何帮助
我是UIDocument
和NSCoding
的新手。所以不能说太多。但我想一些问题可能与NSData
迷失或被破坏有关。我错过了一些基本而重要的东西。我做错了什么?