2

こんにちは、アプリケーションに iCloud サポートを使用しUIDocument、ストレージに使用しています。データをiCloudに保存して、初めて同じものを取得することができました。しかし、デバイスでアプリを削除して再インストールするとEXC BAD ACCESSNSKeyUnarchiver.

コード。

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 人の名前が取得され、テーブルビューに表示されます。これを試してみましUIDocumentたが、私はとにかなり慣れていませんNSCoding。そのため、それらについて多くを語ることはできません。NSDataしかし、迷子になったり破損したりすることに問題がどのように関連している可能性があるかを推測します. ここで基本的で重要な何かが欠けていますか?私は何を間違っていますか?

4

0 に答える 0