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 ...
随机推荐
- Phoenix -修复表索引
索引的修复可以通过2种方式,(关于pehoenix的索引的生命周期可以参考 https://community.hortonworks.com/articles/58818/phoenix-inde ...
- 转(zip文件格式说明)
zip文件由三部分组成:压缩的文件内容源数据.压缩的目录源数据.目录结束标识结构 1. 压缩的文件内容源数据: 记录着压缩的所有文件的内容信息,其数据组织结构是对于每个文件都由file header ...
- ebs如何将客户化的PL/SQL程序发布到webservice
as:cux_gl_hec_iface_soa_pkg. 1.将package声明部分的内容拷贝出来另存为cux_gl_hec_iface_soa_pkg.pls的文件: 2.将该文件上传到服务器上拥 ...
- 原生态ajax 传递json参数到服务器端
案例说明:通过ajax将用户名和密码以json形式传递给服务器端,然后服务器端接受数据,进行处理返回json数据到前端 首先,在客户端,通过JavaScript脚本将页面表单数据封装成JSON格式.L ...
- Delphi 调用Dll的两种方式
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...
- Vuejs使用笔记 --- 框架
这两天学了vuejs的模板,于此纪录一下. 这是整个大文件夹的配置,现在我们看到的所有文件都不需要去管,说要关注也只需要关注“index.html” "index.html"里面是 ...
- arcgis基于地形数据的坡度分析
高程.坡度和坡向是小班中非常重要的因子,坡度对水土保持规划设计具有决定性的作用,是土地利用规划和治理措施配置首先要考虑的因素.如何利用地形数据对坡度进行分析呢,本文即将揭晓. 软件准备: locasp ...
- VMware 虚拟机桥接网络设置
一.桥接的基本原理 配置成桥接网络连接模式的虚拟机就当作主机所在以太网的一部分,虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑,可以像主机一样可以访问以太网中的所有共享资源和网络连 ...
- MySQL分区表管理
RANGE,LIST分区管理 1:为未分区表创建分区 ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2; 2:删除某个分区的数据 ALTER TAB ...
- mobx源码解读1
mobx是redux的代替品,其本身就是一个很好的MVVM框架.因此花点力气研究一下它. 网上下最新的2.75 function Todo() { this.id = Math.random() mo ...