OC对象的归档及解档浅析
一般用在用户登录,保存这个用户的信息
对象归档,就是把内存中对象持久化。
对象解档,就是把持久化的对象读取到内存。
oc中对象归档解档大致分为以下几种方法:
从数量上可以分为:
- 对单个对象归档解档
- 对多个对象归档解档
从对象的存在形式上可以分为:
- 系统对象归档解档
- 自定义对象归档解档
接下来逐一编写代码做简单实现
1.单个系统对象归档及解档:
void SingleSystemObject(){
NSArray *arr = [NSArray arrayWithObjects:@,@"你好",@, nil];
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.txt"]; //对象归档
BOOL success = [NSKeyedArchiver archiveRootObject:arr toFile:filePath];
if (success) {
NSLog(@"归档成功");
} //对象解档
NSArray *arr2 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
for (NSString *str in arr2) {
NSLog(@"%@",str);
}
}
2. 多个系统对象归档及解档
void MultiSystemObject(){
NSArray *arr = [NSArray arrayWithObjects:@,@,@"中文", nil];
NSInteger integer = ;
BOOL archiverBool = YES;
/*------对象归档--------------------*/
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//对多个对象编码归档,key是解档时对象的标识符,可任意编写
//encode有多个重载,但并不是任何系统对象都有重载方法
[archiver encodeObject:arr forKey:@"arr"];
[archiver encodeInteger:integer forKey:@"integer"];
[archiver encodeBool:archiverBool forKey:@"archiverBool"];
//完成编码
[archiver finishEncoding];
NSString *filepath = [NSHomeDirectory() stringByAppendingPathComponent:@"1.txt"];
//将data以原子操作方式写入文件
BOOL success = [data writeToFile:filepath atomically:YES];
if (success) {
NSLog(@"归档成功");
}
/*------对象归档--------------------*/
/*------对象解档--------------------*/
//将文件数据加载入NSData对象
NSData *data2 = [NSData dataWithContentsOfFile:filepath];
//使用NSData对象初始化接档器
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data2];
//根据归档时的类型和key解档对应数据
NSArray *arr2 = [unarchiver decodeObjectForKey:@"arr"];
NSInteger integer2 = [unarchiver decodeIntegerForKey:@"integer"];
BOOL unarchiveBool = [unarchiver decodeBoolForKey:@"archiveBool"];
NSLog(@"%@",arr2);
NSLog(@"%ld",integer2);
NSLog(@"%d",unarchiveBool);
/*------对象接档--------------------*/
}
3.自定义对象归档及解档
自定义对象实现可归档解档,需遵守NSCoding协议,该协议下有两个方法需要实现,分别是
归档编码
- (void)encodeWithCoder:(NSCoder *)aCoder
归档解码
- (id)initWithCoder:(NSCoder *)aDecoder
此两个方法中实现自定义对象中自定义成员变量归档时的编码和解码方式,类似于多系统对象归档的实现方式,即将成员变量按类型编码并制定key,解码时根据key按类型解码并赋值给成员变量,最终将对象返回。简单代码实现如下:
Person.m
@interface Person : NSObject <NSCoding>
@property (copy,nonatomic)NSString *name;
@property (assign,nonatomic)NSInteger age;
@end
@implementation Person
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
- (NSString *)description
{ NSString *desc = [NSString stringWithFormat:@"name = %@,age = %ld",self.name,self.age];
return desc;
}
@end
归档解档代码:
void UserDefinedObject()
{
Person *p = [[Person alloc] init];
p.name = @"yangys";
p.age = ; //归档
NSString *filepath = [NSHomeDirectory() stringByAppendingPathComponent:@"person.txt"];
BOOL success = [NSKeyedArchiver archiveRootObject:p toFile:filepath];
if (success) {
NSLog(@"归档成功");
} //解档
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filepath];
NSLog(@"%@",person);
}
自定义多个对象的归档及解档如多个系统对象的归档及解档。
这里值得一提的是,系统对象的归档及解档中,只有遵守了NSCoding协议或其子协议的系统对象才可进行归档及解档。
OC对象的归档及解档浅析的更多相关文章
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...
- 【KakaJSON手册】07_Coding_归档_解档
KakaJSON可以只用一行代码将常用数据进行归档\解档 后面代码中会用到 file 文件路径 // 文件路径(String或者URL都可以) let file = "/Users/mj/D ...
- iOS开发中的4种数据持久化方式【一、属性列表与归档解档】
iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...
- iOS 自定义的对象类型的解档和归档
自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h ...
- iOS 浅复制、深复制、完全复制的知识点梳理验证(附加归档解档)
在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值 ...
- 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver
在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...
- iOS 浅赋值、深复制、全然复制的知识点梳理验证(附加归档解档)
写于前: 在之前转载的一片文章中.文中对浅复制和深复制进行了具体的解读,同一时候还提到了深复制(one-level-deep copy).全然复制(true copy)的概念,并指出iOS开发中的深复 ...
- iOS:沙盒、偏好设置、归档、解归档
一.沙盒和应用程序包 •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle –Documents –Library/Ca ...
- IOS数据存储之归档/解档
前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...
随机推荐
- html css javascript 加载的顺序
html /css /javascript 这三者的加载顺序影响整个页面的加载速度.而加载速度的快慢直接影响pv(访问量),而且会影响经济收入.在大网站中,可能打开速度快一秒,一年能多带来上亿的收入. ...
- 黑马程序员_ C语言基础之指针(三)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移 ...
- WINDOWS Server2008上部署Oracle10g及oracle SQL语法小记
首先安装10G客户端 情况一:一般都会安装到一般报错.因为10G是32BIT客户端.而操作系统是64位的.但是不会影响配置监听程序.自主开发的应用程序依然可以运行. 情况二:报错但是配置完监听程序始终 ...
- 【WCF全析(一)】--服务协定及消息模式
上周微软开发布会说.NET支持完全跨平台和并开放Core源码的新闻,让我们顿时感到.NET要迎来它的春天.虽然早在几年前.NET就能开发Android和IOS,但是这次的跨平台把Linux都放到了微软 ...
- promise实例小球运动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 数据库的NULL值讨论
有许多关于数据库设计中NULL的讨论,我个人的设计习惯是,不使用NULL值. 我所设计所有表都是Not Null的字段的,尤其是我主要做数据仓库的表设计.刚开始使用数据库时,就栽了一次.一个Group ...
- 外网无法访问本地IIS站点
自己申请了个花生壳动态域名,本来是打算在IIs上建个站点测试一下的,路由器上的端口也配置好了,把80端口指向我本机.域名也通过 ping 测试确实指向了我这里的路由器.但是用这个域名老是访问不了我这个 ...
- template.js遍历对象的写法
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>菜鸟 ...
- 【转】ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
[转自]https://my.oschina.net/itblog/blog/547250 摘要: 前段时间研究的Log4j+Kafka中,有人建议把Kafka收集到的日志存放于ES(ElasticS ...
- phpstorm 16.1 注册码
phpstorm 2016.1 的注册与phpstorm 10 相同,可以采用:“服务器注册” 方式进行注册,又快又方便. 服务器注册:http://idea.qinxi1992.cn IDEA 20 ...