NSKeyedArchiver archivedDataWithRootObject:
Posted
技术标签:
【中文标题】NSKeyedArchiver archivedDataWithRootObject:【英文标题】:NSKeyedArchiver archivedDataWithRootObject: 【发布时间】:2011-04-14 08:03:22 【问题描述】:NSKeyedArchiver 的参数是archivedDataWithRootObject: 应该是我要保存的数组,还是转换成NSData 的数组?
【问题讨论】:
【参考方案1】:裕二的回答是对的。但更准确地说,您的数组元素必须实现协议并将您自己的代码填充到方法 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"];
然后您可以使用归档器和取消器,例如:
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”。
【讨论】:
【参考方案2】:要将通用数组转换为NSData
,您需要一个存档器!如果你知道如何喂NSData
,你就会知道如何使用NSKeyedArchiver
。所以:
NSArray* array= ... ;
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];
当然,array
中的所有元素都需要实现 encodeWithCoder:
。
【讨论】:
为了完整起见,您使用 NSKeyedUnarchiver 进行反向操作。 "你数组中的所有元素都需要实现encodeWithCoder:" 数组中的所有元素都需要由 Apple 或您实现encodeWithCoder:
。您可以通过查看官方文档来检查 Apple 提供的对象是否实现了它……看看它是否实现了协议 NSCoder
。以上是关于NSKeyedArchiver archivedDataWithRootObject:的主要内容,如果未能解决你的问题,请参考以下文章
从 NSKeyedArchiver 中提取 NSString
如何将 UIDocumentPickerViewController 导入限制为 .archive 文件? (NSKeyedArchiver)