本文共 2420 字,大约阅读时间需要 8 分钟。
5、对象的归档
概念:对象归档是指将对象写入文件保存在硬盘上,当再次重新打开程序时,可以还原这些对象。亦可以称作对象序列号,对象持久化
5.1数据持久化的方式
NSKeyedArchiver---对象归档
NSUserDefaults
属性列表化(NSArray,NSDictionary保存文件)
SQLite数据库,CoreData
5.2 归档的形式 对Foundation库对象进行归档 自定义对象进行归档(需要实现归档协议,NSCoding) 归档后的文件是加密的,属性列表是明文的 //归档 (序列化) 编码 NSString*homeDirectory = NSHomeDirectory(); NSArray *array5 = @[@123,@456,@"999",@"000"]; NSString*filePath = [homeDirectory stringByAppendingPathComponent:@"array.archive"]; if ([NSKeyedArchiver archiveRootObject:array5 toFile:filePath]) { NSLog(@"archiver success"); } //解归档(反序列化) 解码 NSArray*unArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSLog(@"new Array:%@",unArray); 6 自定义内容归档 6.1 归档 使用NSData实例作为归档的存储数据 添加归档的内容 (设置key和value) 完成归档 将归档数据存入磁盘中 6.2 解归档 从磁盘读取数据,生成NSData实例 根据Data实例创建和初始化归档实例 解归档,根据key访问value的值 // archiver 压缩程式 //自定义内容归档 //归档 序列化 编码 NSString*homePath = NSHomeDirectory(); NSString*customfilePath= [homePath stringByAppendingPathComponent:@"customContent.archive"]; NSMutableData*data = [NSMutableData data]; NSKeyedArchiver*archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeFloat:50.0 forKey:@"weight"]; [archiver encodeObject:@"Tim" forKey:@"name"]; [archiver finishEncoding]; [archiver release]; [data writeToFile:customfilePath atomically:YES]; // 解归档 //读取归档数据 NSData*content = [NSData dataWithContentsOfFile:customfilePath]; NSLog(@"%@",content); //解归档 NSKeyedUnarchiver*unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:content]; //解归档数据 float weight = [unarchiver decodeFloatForKey:@"weight"]; NSString*name = [unarchiver decodeObjectForKey:@"name"]; NSLog(@"-----%f-------%@",weight,name); 7 自定义对象的归档基本概念 对象要支持归档,需要实现NSCoding协议 NSCoding协议有两个方法,encodeWithCoder方法对对象的属性数据做编码处理,initWithCoder解码归档数据来初始化对象 实现NSCoding协议后,就能通过NSKeyedArchiver归档. //编码 obj----> data - (void)encodeWithCoder:(NSCoder *)aCoder { // <NSKeyedArchiver: 0x8e7c160> NSLog(@"这是一个编码的方法,作用就是对当前类的属性进行一一编码--%@",aCoder); // 对属性进行编码 [aCoder encodeObject:_nameStr forKey:KEY_NAME]; [aCoder encodeObject:_phoneStr forKey:KEY_PHONE]; } //解码 data---> obj - (id)initWithCoder:(NSCoder *)aDecoder { // <NSKeyedUnarchiver: 0x8f4e910> NSLog(@"这是一个解码的方法,作用就是对保存在NSCoder对象中编过码的数据进行解码,在一一的赋值给当前类的属性。--- %@",aDecoder); self = [super init]; if (self) { // 这里的获得的解码过后的对象,用当前的属性保存,要使用self. self.nameStr = [aDecoder decodeObjectForKey:KEY_NAME]; self.phoneStr = [aDecoder decodeObjectForKey:KEY_PHONE]; } return self; }
转载地址:http://geyni.baihongyu.com/