NSKeyedArchiver archivedDataWithRootObject:

时间:2010-09-19 13:25:17

标签: objective-c cocoa-touch nsmutablearray nsdata nskeyedarchiver

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

2 个答案:

答案 0 :(得分:15)

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

- (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"];
}

然后你可以使用archiver和unchariver,如:

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

NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"];
NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData];

更多信息,您可以参考“Archiving Objective-C Objects with NSCoding”。

答案 1 :(得分:12)

要将通用数组转换为NSData,您需要一个归档程序!如果您知道如何提供NSData,则知道如何使用NSKeyedArchiver。所以:

NSArray* array= ... ;
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];

当然,array中的所有元素都需要实现encodeWithCoder: