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:,它们(在一行中!)为您创建一个 plist 文件并将一个 plist 读入 NSDictionary;只要所有内容都是“plist 对象”(NSStrings、NSArrays、NSNumbers 等)。

于 2012-08-27T05:45:22.620 回答