NSKeyedArchiver archivedDataWithRootObject:

nod*_*nja 6 cocoa-touch objective-c nsmutablearray nskeyedarchiver nsdata

NSKeyedArchiver的参数是archivedDataWithRootObject:应该是我要保存的数组,还是转换为NSData的数组?

Bru*_*Lee 16

Yuji的回答是对的.但更确切地说,你的数组元素必须实现协议并将你自己的代码填充到方法initWithCoder:和encodeWithCoder:like:

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        self.title = [decoder decodeObjectForKey:@"title"];
        self.author = [decoder decodeObjectForKey:@"author"];
        self.published = [decoder decodeBoolForKey:@"published"];
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:title forKey:@"time"];
    [encoder encodeObject:author forKey:@"author"];
    [encoder encodeBool:published forKey:@"published"];
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用archiver和unchariver像:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notes];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"notes"];

NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"];
NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData];
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以参考" 使用NSCoding存档Objective-C对象 ".


Yuj*_*uji 12

要将通用数组转换为a NSData,需要一个归档器!如果您知道如何喂食NSData,您就知道如何使用NSKeyedArchiver.所以:

NSArray* array= ... ;
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];
Run Code Online (Sandbox Code Playgroud)

当然,您array需要实现的所有元素encodeWithCoder:.

  • 为了完整起见,您使用NSKeyedUnarchiver来执行相反的操作. (4认同)