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表达式成立则执行{ }里的语句:双 ...
随机推荐
- [硬件项目] 2、汽车倒车雷达设计——基于专用倒车雷达芯片GM3101的设计方案与采用CX20106A红外线检测芯片方案对比
前言 尽管每辆汽车都有后视镜,但不可避免地都存在一个后视镜的盲区,倒车雷达则可一定程度帮助驾驶员扫除视野死角和视线模糊的缺陷,提高驾驶安全性.上一节已经分析清倒车雷达的语音模块(上一节),本节将深入分 ...
- 虚拟化平台cloudstack(8)——从UI开始
UI ucloudstack采用的是前后端分离的架构,就是说前端可以选择使用web.swing甚至其它的界面,都可以. 我们来看cloudstack的UI信息吧,所有的cloudstack的UI都在{ ...
- NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇
上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 上次介绍了NanoProfiler的基本功能,提到,NanoProfiler实现了MiniProfiler欠 ...
- 搭建jekyll博客
使用jekyll将markdown文件生成静态的html文件,并使用主题有序的进行布局,形成最终的博客页面. 特点 基于ruby 使用Markdown书写文章 无需数据库 可以使用GitHub Pag ...
- BOM之navigator、history、screen对象
navigator对象 [定义] navigator已经成为识别客户端浏览器的事实标准.下表中列出存在于所有浏览器的属性和方法 [检测插件] 检测浏览器插件是一种最常见的检测例程. [1]对于非IE浏 ...
- Spark入门实战系列--8.Spark MLlib(下)--机器学习库SparkMLlib实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analys ...
- PHP面向对象中的重要知识点(二)
1. __toString: 当对象被打印时,如果该类定义了该方法,则打印该方法的返回值,否则将按照PHP的缺省行为输出打印结果.该方法类似于Java中的toString(). <?php cl ...
- 【AngularJS】—— 12 独立作用域
前面通过视频学习了解了指令的概念,这里学习一下指令中的作用域的相关内容. 通过独立作用域的不同绑定,可以实现更具适应性的自定义标签.借由不同的绑定规则绑定属性,从而定义出符合更多应用场景的标签. 本篇 ...
- Android的UI设计与后台线程交互
本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行.本文还将阐述一些用户界面(UI)中与线程交互的API.UI用户界面 ...
- oracle数据库字符集US7ASCII,在java中处理中文问题
原来项目中oracle数据库一直是US7ASCII,我新项目对接的时候,查询以及插入中文,出现乱码问题. 暂时未能解决此问题,最终决定每次转码: 查询的时候: List<Record> l ...