归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存,文件将被保存成自定
义类型的文件,相对于NSUserDefault具有更好的保密性。
 
1.使用archiveRootObject进行单个对象的归档
使用NSKeyedArichiver进行归档、NSKeyedUnarchiver进行解档,这种方式会在写入、读出数据之
前对数据进行序列化、反序列化操作。
 
归档:
//获取根目录
NSString *homeDictionary = NSHomeDirectory();
//添加储存的文件名
NSString *homePath = [homeDictionary
stringByAppendingPathComponent:@"atany.archiver"];
//归档一个字符串
BOOL flag = [NSKeyedArchiver archiveRootObject:@"归档" toFile:homePath];
这种方式可以对字符串、数字等进行归档,当然也可以对NSArray与NSDictionary进行归档。返回
值Flag标志着是否归档成功,YES为成功,NO为失败。
 
解档:
NSString* str=[NSKeyedUnarchiver unarchiveObjectWithFile:homePath];
使用NSKeyedUnarchiver进行接档(反序列化)。
 
2.对多个对象的归档
同样是使用NSKeyedArchiver进行归档,不同的是同时归档多个对象,这里举例放入了一个
CGPoint点、字符串、整数(当然很多类型都可以的,例如UIImage、float等等),使用encode
方法进行归档,最后通过writeToFile方法写入文件。
 
归档:写入数据
//准备数据
CGPoint point = CGPointMake(1.0, 2.0);
NSString *info = @"坐标原点";
NSInteger value = ;
//获取Home目录并创建multi.archiver文件
NSString *multiHomePath = [NSHomeDirectory()
stringByAppendingPathComponent:@"multi.archiver"];
//创建NSMutableData对象 用来存储归档数据
NSMutableData *data = [[NSMutableData alloc]init];
NSKeyedArchiver *archvier = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:data];
//对多个对象进行归档
[archvier encodeCGPoint:point forKey:@"kPoint"];
[archvier encodeObject:info forKey:@"kInfo"];
[archvier encodeInteger:value forKey:@"kValue"];
[archvier finishEncoding];
//写入文件
[data writeToFile:multiHomePath atomically:YES];
解档:从路径中获得数据构造NSKeyedUnarchiver实例,使用decodeXXXForKey方法获得文件中的对
象。
NSMutableData *dataR = [[NSMutableData alloc]initWithContentsOfFile:multiHomePath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:dateR];
CGPoint pointR = [unarchiver decodeCGPointForKey:@"kPoint"];
NSString *infoR = [unarchiver decodeObjectForKey:@"kInfo"];
NSInteger valueR = [unarchiver decodeIntegerForKey:@"kValue"];
[unarchiver finishDecoding];
NSLog(@"%f,%f,%@,%d",pointR.x,pointR.y,infoR,valueR);
3.对自定义对象进行归档
自定义对象,应用范围很广,因为它对应着MVC中的Model层,即实体类。在程序中,我们会在
Model层定义很多的entity,例如User,Teacher等。
 
那么对自定义对象的归档显得重要得多,因为很多情况下我们需要在Home键之后保存数据,在程序
恢复时重新加载,那么,归档便是一个好的选择。
 
首先自定义一个实体类,Archive。
 
Archive.h
#import <Foundation/Foundation.h> 

@interface Archive : NSObject
@property (copy,nonatomic) NSString *name;
@property NSInteger age;
@property (copy,nonatomic) NSString *address;
@property (copy,nonatomic) UIImage *photo; @end
 
Archive.m
#import "Archive.h"
#define kNameKey @"NameKey"
#define kAgeKey @"AgeKey"
#define kAddress @"AddressKey"
#define kPhotoKey @"PhotoKey" @implementation Archive
@synthesize name = _name;
@synthesize age = _age;
@synthesize address = _address;
@synthesize photo = _photo; #pragma mark - NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_name forKey:kNameKey];
[aCoder encodeInteger:_age forKey:kAgeKey];
[aCoder encodeObject:_address forKey:kAddress];
[aCoder encodeObject:_photo forKey:kPhotoKey];
} - (id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
_name = [aDecoder decodeObjectForKey:kNameKey];
_age = [aDecoder decodeIntegerForKey:kAgeKey];
_address = [aDecoder decodeObjectForKey:kAddress];
_photo = [aDecoder decodeObjectForKey:kPhotoKey];
}
return self;
} #pragma mark - NSCoping
- (id)copyWithZone:(NSZone *)zone {
Archive *copy = [[[self class] allocWithZone:zone] init];
copy.name = [self.name copyWithZone:zone];
copy.age = self.age;
copy.address = [self.address copyWithZone:zone];
copy.photo = self.photo;
return copy;
}
@end
Archive类有四个字段(名字、年纪、地址、头像),除了年纪为整型之外,其他的都看作Object
【注】:要将一个自定义的类进行归档,那么类里面的每个属性都必须是可以被归档的,如果是不
能归档的类型,我们可以把他转化为NSValue进行归档,然后在读出来的时候在转化为相应的类。
 
Archive实现了三个委托方法1)encodeWithCoder: 2)initWithCoder:  3)copyWithZone:
 
1)encodeWithCoder
Encodes the receiverusing a given archiver
通过一个给定的archiver把消息接收者进行编码。
当接收到encodeObject消息的时候,类终端encodeWithCoder方法被调用。
 
2)initWithCoder
Returns an objectinitialized from data in a given unarchiver. (required)
从一个给定unarchiver的数据中返回一个初始化对象。
 
3)copyWithZone
Returnsa new instance that’s a copy of the receiver
返回消息接收者的一个复制的新实例。
 
归档:
//保存图片与归档
- (IBAction)save:(id)sender {
//准备数据
NSString *name = @"Exile";
NSInteger age = ;
NSString *address = @"Address";
UIImage *photo = [UIImage imageNamed:@"login.jpg"];
//存储数据到类
Archive *archivingData = [[Archive alloc] init];
archivingData.name = name;
archivingData.age = age;
archivingData.address = address;
archivingData.photo = photo;
//归档
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:data];
// archivingDate的encodeWithCoder 方法被调用
[archiver encodeObject:archivingData forKey:kArchivingDataKey];
[archiver finishEncoding];
//写入文件
[data writeToFile:self.archivingFilePath atomically:YES];
}
 
解档:
- (IBAction)loadArchive:(id)sender {
NSData *data = [[NSMutableData alloc]
initWithContentsOfFile:self.archivingFilePath];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
//获得类
//initWithCoder方法被调用
Archive *archivingData = [unarchiver decodeObjectForKey:kArchivingDataKey];
[unarchiver finishDecoding]; //读取的数据
NSString *name = archivingData.name;
NSInteger age = archivingData.age;
NSString *address = archivingData.address;
self.imageView.image = archivingData.photo;
NSLog(@"%@||%d||%@",name,age,address);
}

iOS 归档archive使用方法的更多相关文章

  1. (转) ORACLE 正确删除归档日志的方法

    ORACLE 正确删除归档日志的方法 我们都知道在controlfile中记录着每一个archivelog文件的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的controlfile中 ...

  2. iOS-提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  3. iOS中的过期方法和新的替代方法

    关于iOS中的过期方法和新的替代方法 1.获取某些类的UINavigationBar的统一外观并设置UINavigationbar的背景 注:方法名改了但是基本使用方法不变 + (instancety ...

  4. opencv直线检测在c#、Android和ios下的实现方法

    opencv直线检测在c#.Android和ios下的实现方法 本文为作者原创,未经允许,不得转载 :原文由作者发表在博客园:http://www.cnblogs.com/panxiaochun/p/ ...

  5. iOS开发——实用篇&提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  6. iOS与HTML5交互方法总结(转)

    今天小编在找技术文章的时候,发现这样一个标题:iOS与HTML5交互方法总结,怎么看着这么熟悉呢?   还以为是刚哥用了别的文章,点进去一看,原来是刚哥自己写的文章,他们转载的,而且还上了Dev St ...

  7. iOS UISearchController 的使用方法

    iOS UISearchController 的使用方法 UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作.UISearchCon ...

  8. IOS常见的加密方法,常用的MD5和Base64

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

  9. iOS与HTML5交互方法总结(修正)

    摘要 看了不少别人写的博客或者论坛,关于iOS与HTML5交互方法大概主要有5种方式: 1. 利用WKWebView进行交互(系统API) 2. 利用UIWebView进行交互(系统API) 3. 苹 ...

随机推荐

  1. C#进阶系列——DDD领域驱动设计初探(六):领域服务

    前言:之前一直在搭建项目架构的代码,有点偏离我们的主题(DDD)了,这篇我们继续来聊聊DDD里面另一个比较重要的知识点:领域服务.关于领域服务的使用,书中也介绍得比较晦涩,在此就根据博主自己的理解谈谈 ...

  2. Tornado 结合memcached缓存页面

    原因 Blog是一个更新并不很频繁的一套系统,但是每次刷新页面都要更新数据库反而很浪费资源,添加静态页面生成是一个解决办法,同时缓存是一个更好的主意,可以结合Memcached添加少量的代码进行缓存, ...

  3. NSURLConnection的使用

    一:NSURLConnection(IOS9.0已经弃用)是早期apple提供的http访问方式.以下列出了常用的几个场景:GET请求,POST请求,Response中带有json数据 对于NSURL ...

  4. ssh项目将搜索条件进行联动

    <s:form namespace="/tb" action="tenderList" name="searchForm" id=&q ...

  5. Message启动菜单个性化制作工具V1.0.3.1最终版

    特点及功能 1.可以全新制作Message启动菜单文件!也可以选择修改已存在的菜单文件,制作或预览时会提示以哪个菜单版本为核心启动菜单. 2.支持更换背景图片,也支持图片标准化防止启动时黑屏,在选择背 ...

  6. Python 安装easy_install详解

    easy_install 真的特别方便.我之前安装pip.wheel.bs4.requests等都是用python setup.py install 安装,操作步骤还不算很烦(但是对比easy_ins ...

  7. oracle 表字段添加 修改 删除语法

    修改列名 alter table 表明 rename column rename 老列名 to 新列名添加 字段alter table 表名 add(字段名 类型):删除字段alter table 表 ...

  8. JAVA之IO流(字节流)

    输入和输出 JAVA的流分为输入流和输出流两部分, 输入流:InputStream或者Reader:从文件中读到程序中: 输出流:OutputStream或者Writer:从程序中输出到文件中: Re ...

  9. Map工具系列-01-Map代码生成工具说明

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  10. Alpha阶段第三次Scrum Meeting

    情况简述 Alpha阶段第三次Scrum Meeting 敏捷开发起始时间 2016/10/24 00:00 敏捷开发终止时间 2016/10/25 00:00 会议基本内容摘要 总结了之前学习的内容 ...