iOS阶段学习第18天笔记(Plist-Archiver-归档与解归档操作)
iOS学习(OC语言)知识点整理
一、归档与解归档的操作
1)归档是一个过程,将一个或多个对象存储起来,以便以后可以还原,包括将对象存入文件,以后再读取
将数据对象归档成plist文件
2)plist文件中只能存放:NSString、NSDate、NSNumber、Bool、NSData、NSArray、NSDictionary
并且NSArray和NSDictionary中只能是以上的类型
3)归档存放时数据是什么类型,读取数据时就用什么类型的数据接收。
4)归档不能直接操作自定义对象类型的数据。
5)归档与解归档操作实例代码 :
//创建一个二维数组(数组中每个元素又是一个数组对象)
NSMutableArray *array1=[[NSMutableArray alloc]init];
for(int i=;i<;i++){
[array1 addObject:[NSString stringWithFormat:@"str%d",i+]];
} NSMutableArray *array2=[[NSMutableArray alloc]init];
for(int i=;i<;i++){
[array2 addObject:[NSNumber numberWithInt:arc4random()%]];
} NSArray *bigArray=@[array1,array2];
//将数组对象写入文件,(先写入内存中,如果写入成功,马上存入文件)
[bigArray writeToFile:@"/Users/kingkong/Desktop/day08/array.plist" atomically:YES]; //将plist文件的内容直接读取出存入数组
NSArray *newArray=[[NSArray alloc]initWithContentsOfFile:@"/Users/kingkong/Desktop/day08/array.plist"];
NSLog(@"%@",newArray); NSArray *emails=@[@"zhangsan@163.com",@"zhangsan@qq.com"];
//创建一个字典对象
NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",@"",@"password",emails,@"email", nil];
//将字典对象写入文件
[dict writeToFile:@"/Users/kingkong/Desktop/day08/dict.plist" atomically:YES]; //将plist文件的内如读取出来存入字典
NSDictionary *newDict=[NSDictionary dictionaryWithContentsOfFile:@"/Users/kingkong/Desktop/day08/dict.plist"];
NSLog(@"%@",newDict);
6)归档与解归档自定义类数据 实例代码:
1、定义一个Birthday类,在.h文件中遵守NSCoding 协议 例如:
@interface Birthday : NSObject<NSCoding>
//出生日期类,年、月、日
@property(nonatomic,assign)int year;
@property(nonatomic,assign)int month;
@property(nonatomic,assign)int day;
@end
2、在.m文件中实现NSCoding协议方法 例如:
#import "Birthday.h"
@implementation Birthday
//在归档时自动调用这个方法,将所有的成员变量编码(给成员变量设置相应的键)
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt:_year forKey:@"year"];
[aCoder encodeInt:_month forKey:@"month"];
[aCoder encodeInt:_day forKey:@"day"];
} -(id)initWithCoder:(NSCoder *)aDecoder
{
if(self=[super init]){
_year=[aDecoder decodeIntForKey:@"year"];
_month=[aDecoder decodeIntForKey:@"month"];
_day=[aDecoder decodeIntForKey:@"day"];
}
return self;
}
@end
3、在 main 文件中执行归档与解归档方法 例如:
Birthday *b=[[Birthday alloc]init];
b.year=;
b.month=;
b.day=; //b必须遵守归档协议
NSString *path=@"/Users/kingkong/Desktop/day09/Birthday.data";
//执行归档操作
BOOL ret=[NSKeyedArchiver archiveRootObject:b toFile:path];
if(ret){
//执行解归档操作
Birthday *b2=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"year:%i",b2.year);
}
7)将多个对象归档到一个文件中 实例代码
1、定义一个Person类 在.h文件中遵守NSCoding协议 例如:
#import <Foundation/Foundation.h>
//如果要对对象进行归档,必须遵守归档协议,实现协议中规范的方法
@interface Person : NSObject<NSCoding>
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
-(void)print;
@end
2、在.m中实现协议方法 例如:
#import "Person.h"
@implementation Person
//在归档时自动调用这个方法,将所有的成员变量编码(给成员变量设置相应的键)
- (void)encodeWithCoder:(NSCoder *)aCoder
{
NSLog(@"%@",NSStringFromSelector(_cmd));
//encodeInt 用于整型数据 encodeObject 用于字符串或对象
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"];
}
//解归档时自动调用此方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
//如果父类也遵守了归档协议,self=[super initWithCode:aDecode]
if(self=[super init]){
//根据编码时的键取值decodeIntForKey 用于整型数据 decodeObjectForKey 用于字符串或对象
_name=[aDecoder decodeObjectForKey:@"name"];
_age=[aDecoder decodeIntForKey:@"age"];
}
return self;
}
-(void)print
{
NSLog(@"name:%@,age:%d",_name,_age);
}
@end
3、在main文件中执行方法 例如:
Person *p1=[[Person alloc]init];
p1.name=@"kingkong";
p1.age=; NSArray *array1=@[@"red",@"blue",@"yellow"]; //创建一个对象的缓冲区空间
NSMutableData *mutableData=[[NSMutableData alloc]init];
//创建一个归档器,关联一个对象的缓冲区
NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:mutableData];
//将对象编码后存入缓冲区
[archiver encodeObject:p1 forKey:@"person"];
[archiver encodeObject:array1 forKey:@"array"];
//编码结束
[archiver finishEncoding];//
//将缓冲区中的数据写入到文件中
NSString *path=@"/Users/kingkong/Desktop/day09/doc.data";
BOOL ret=[mutableData writeToFile: path atomically:YES];
NSLog(@"ret=%d",ret); //解归档操作
NSData *data=[NSData dataWithContentsOfFile: path];
//创建一个解归档器对象指定数据所在的缓冲区
NSKeyedUnarchiver *unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:data];
//使用解归档器提取数据
Person *p2=[unarchiver decodeObjectForKey:@"person"];
NSArray *array2=[unarchiver decodeObjectForKey:@"array"];
//解归档结束
[unarchiver finishDecoding];
//NSLog(@"%@,%d",p2.name,p2.age);
[p2 print];
NSLog(@"%@",array2);
iOS阶段学习第18天笔记(Plist-Archiver-归档与解归档操作)的更多相关文章
- iOS 阶段学习第七天笔记(函数、递归)
iOS学习(C语言)知识点整理笔记 一.函数 1)概念:具有特定功能的代码块的封装 2)函数的定义: 函数类型+函数名(形参列表) 函数类型 函数名(形参类型1 形参名1,形参类型2 形参名2 ...
- iOS阶段学习第29天笔记(UITextField的介绍)
iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField 初始化实例代码: //创建一个UIt ...
- iOS阶段学习第20天笔记(MRC内存管理)
iOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效 OC中采用 ...
- iOS阶段学习第15天笔记(NSDate操作)
iOS学习(OC语言)知识点整理 一.OC关于NSDate类的操作实例代码 //默认直接显示对象,显示的是格林威治时间 //获取当前日期时间的实例方法 NSDate *date1=[[NSDate a ...
- iOS阶段学习第14天笔记(NSString与NSMutableString)
iOS学习(OC语言)知识点整理 一.OC字符串的操作 1)OC中字符串分为两种: 1.不可变字符串NSString:不能修改对象内容,但是可以改变对象的指针. 2.可变字符串NSMutableStr ...
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- iOS阶段学习第四天笔记(循环)
iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ } 两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...
- iOS阶段学习第三天笔记(运算符)
iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...
- iOS 阶段学习第四天笔记(循环)
iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ } 两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...
随机推荐
- [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
在调试一个自己做的手环,每次用keil烧写好程序运行的蓝牙.陀螺仪都是正常的.但是掉电再上电之后蓝牙是好的.陀螺仪可以读出ID但是读出的加速度和角速度数据全为0. 下面是发生问题时main函数的前面部 ...
- 自动更新Chromium
Chromium 其实就是开发版本的Chrome, 即Chrome dev 版本.一般他的版本要比正式版的Chrome高两个及以上.比如正式版本现在是29,开发者版本已经是32了. 这表示很多新功能你 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- C#学习系列-抽象方法与虚拟方法的区别
参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9838&ct=31054 如 ...
- iOS-数据解析XML解析的多种平台介绍
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...
- iOS开发——高级技术OC篇&运行时(Runtime)机制
运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...
- asp.net Web.config 在不同版本的IIS配置的IHttpHandler的访问路径,以及经典模式和集成模式不同的配置
如果IIS7.0使用.net4.0以上版本的框架,<system.web>中的httpHandlers节点就没有用了,而应该使用微软专为.net4.0以上版本设计的新节点<syste ...
- AntV 数据可视化解决方案发布
今天蚂蚁金服发布了一套数据可视化规范AntV. AntV 是一套专业的数据可视化规范,这套规范的目的是为了让可视化的使用者更懂数据可视化.这套规范是蚂蚁金服在可视化建设过程中的理论沉淀,它可以很好得指 ...
- python2与python3在windows下共存
python有python2(工业版)和python3,有时候我们会希望电脑上既有python2也有python3,!假设我们已经安装好,python2和python3了, 接下来我们找到python ...
- 【.net】从比较两个字节数组谈起
上午,有位初学者朋友问:如何比较两个字节数组中各字节是否相等? 不许笑,我一向反对嘲笑初学者,初学者不认真学习时你可以批评,但不能讥嘲.你不妨想想,你自己开始学习编程的时候又是什么个光景? 好,于是, ...