使用UIDocument从iCloud取消归档数据时出现错误访问

时间:2013-05-30 10:43:21

标签: iphone ios icloud nskeyedarchiver uidocument

您好我正在使用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但没有任何帮助 我是UIDocumentNSCoding的新手。所以不能说太多。但我想一些问题可能与NSData迷失或被破坏有关。我错过了一些基本而重要的东西。我做错了什么?

0 个答案:

没有答案