0

NSStringsのみを含む辞書をアーカイブしたいのですが、アーカイブを解除すると、エラーが発生しました。

[NSKeyedUnarchiver initForReadingWithData:]:キーなしのアーカイブはNSKeyedUnarchiverでデコードできません

私のコードは次のとおりです。

- (IBAction)startArchive:(id)sender {
    NSString *path = [self pathForDataFile];
    NSMutableDictionary *ageDictionary= [NSMutableDictionary dictionary];
    [ageDictionary setValue:@"12" forKey:@"Jack"];
    [ageDictionary setValue:@"22" forKey:@"John"];
    [NSArchiver archiveRootObject:ageDictionary toFile:path];
}


- (IBAction)unarchive:(id)sender {
    NSString *path = [self pathForDataFile];
    NSDictionary *rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@",rootObject);
}
4

2 に答える 2

3

その理由はUnarchiverです。アーカイバにNSArchiverを使用しました。unarchiverとして、NSUnarchiverを使用する必要があります。NSKeyedArchiverを使用する場合は、NSKeyedUnarchiverを使用する必要があります。

あなたは彼らを混乱させています。

流れるコードはテスト作業です:

    #import <Foundation/Foundation.h>

void startArchive() {
    NSString *path = @"/Users/dinosaur/Desktop/test.plist";
    NSMutableDictionary *ageDictionary= [NSMutableDictionary dictionary];
    [ageDictionary setValue:@"12" forKey:@"Jack"];
    [ageDictionary setValue:@"22" forKey:@"John"];
    [NSArchiver archiveRootObject:ageDictionary toFile:path];
}


void unarchive() {
    NSString *path = @"/Users/dinosaur/Desktop/test.plist";
    NSDictionary *rootObject = [NSUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"%@",rootObject);
}


int main(int argc, char *argv[]) {
    @autoreleasepool {
        startArchive();
        unarchive();
    }
}

=============

これはログです:

2012-08-27 14:03:11.511無題[7930:707]{ジャック=12; ジョン=22; }

于 2012-08-27T06:11:06.953 に答える
1

NSDictionary(および同様の「plist」クラス)のplistの「深い」サポートを利用できます。writeToFile:atomically:dictionaryWithContentsOfFile:をチェックしてください。これは、(1行で!)plistファイルを作成し、plistをNSDictionaryに読み込みます。すべてのコンテンツが「plistオブジェクト」(NSStrings、NSArrays、NSNumbersなど)である限り。

于 2012-08-27T05:45:22.620 に答える