Object 保存到文件中
6月4日 Object 保存到文件中
Q、 你添加一个新类到你的项目当中且你希望可以保存这个类的一个实例对象到磁盘文件 并在需要时从磁盘文件读回到内存中
A、 方案
确保你的类遵循 NSCoding 协议且在类中实现了需要是实现的方法.不要担心,在本节 的讨论部分我会带着你学习.
D、 讨论
在 IOS SDK 中有两个非常方便类来达到这个目的,在程序开发的术语中叫做编组,他们 是:
NSKeyedArchiver 一个利用键值来归档或存储对象或对象树的类.对象的每一个值,我们称为属性,
都能使用程序员选定的键值来归档.你将获得一个归档文件,让后你将可以保存你的
数值通过所选定顶的键值,此很像一个字典. NSKeyedUnarchiver
此类进行与归档类相反的操作.它能很简单地给你未归档的字典并要求你读取值到 属性中.
为了让归档及反归档工作正常,你需要确保需要归档及反归档的对象遵循 NSCoding 协 议.让我们以一个简单的 Person 类开始,如下是这个类的头文件:
@interface Person : NSObject<NSCoding>
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@end
如果现在你不写此类的任何实现代码且进行编译,你将会考到编译器抛出的警告,说你 没有遵循NSCoding协议且没有实现需要实现的方法.需要实现的方法如下:
- (void)encodeWithCoder:(NSCoder *)aCoder 此方法将给你一个编码器对象.此编码器对象你可以像一个词典那样使用,可以简单的通过你所选择的键值 存储数值进去.
- (id)initWithCoder:(NSCoder *)aDecoder; 当你使用NSKeyedUnarchiver对象反归档你的对象时,此方法将被调用.你可以很简单的通过传递进来的 NSCoder对象获取你回的数值
现在,基于上面的信息,我们实现我们的类:
#import "Person.h"
NSString *const kFirstNameKey = @"FirstNameKey";
NSString *const kLastNameKey = @"LastNameKey";
@implementation Person
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.firstName forKey:kFirstNameKey];
[aCoder encodeObject:self.lastName forKey:kLastNameKey];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self != nil) {
_firstName = [aDecoder decodeObjectForKey:kFirstNameKey];
_lastName = [aDecoder decodeObjectForKey:kLastNameKey];
}
return self;
}
@end
NSString *const kFirstName = @"Steven";
NSString *const kLastName = @"Jobs";
/* Determine where we want to archive the object */
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"steveJobs"];
/* Instantiate the object */
Person *steveJobs = [[Person alloc] init];
steveJobs.firstName = kFirstName;
steveJobs.lastName = kLastName;
/* Archive the object to the file */
NSData *data= [NSKeyedArchiver archivedDataWithRootObject:steveJobs];
[data writeToFile:filePath atomically:YES];
NSData *readData = [NSData dataWithContentsOfFile:filePath];
Person *cloneOfSteveJobs = [NSKeyedUnarchiver unarchiveObjectWithData:readData];
if ([cloneOfSteveJobs.firstName isEqualToString:kFirstName] &&
[cloneOfSteveJobs.lastName isEqualToString:kLastName]){
NSLog(@"Unarchiving worked"); } else {
NSLog(@"Could not read the same values back. Oh no!");
}
或者这样
/* Determine where we want to archive the object */
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"steveJobs.txt"];
/* Instantiate the object */
Person *steveJobs = [[Person alloc] init];
steveJobs.firstName = kFirstName;
steveJobs.lastName = kLastName;
/* Archive the object to the file */
[NSKeyedArchiver archiveRootObject:steveJobs toFile:filePath];
/* Now unarchive the same class into another object */
Person *cloneOfSteveJobs =
[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
/* Check if the unarchived object has the same first name and last name as the previously archived object */
if ([cloneOfSteveJobs.firstName isEqualToString:kFirstName] &&
[cloneOfSteveJobs.lastName isEqualToString:kLastName]){
NSLog(@"Unarchiving worked"); } else {
NSLog(@"Could not read the same values back. Oh no!");
}
Object 保存到文件中的更多相关文章
- Python3操作MySQL,查询数据并保存到文件中
我们在测试过程中,可能需要到数据库中拉去一些数据,为从测试准备.比如最近在做接口性能测试的时候,就需要很多数据来支撑,所以就需要的数据库去查询数据,下面就是python3 查询 mysql 并且保存到 ...
- Java将对象保存到文件中/从文件中读取对象
1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...
- php cUrl模拟登录,cookie保存到文件中
源码如下: <?php header("Content-Type:text/html;charset=utf-8"); //模拟群友通讯录手机号登录 $curl = curl ...
- jmeter 发送http请求,并把获取到的请求的订单信息保存到文件中
有一个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是用jmeter 发送http请求,使用正则表达式获取到订单号,并把订单号和线程号作为参数提供给java请求,在java请求 ...
- 谷歌浏览器修改CSS和js后同步保存到文件中 (译)
本文标题:谷歌浏览器修改CSS和js后同步保存到文件中. 文本作者:魔芋铃. 英文原文:http://www.stephensaw.me/google-chrome-devtools-source-m ...
- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中
既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...
- 『无为则无心』Python日志 — 66、将日志信息保存到文件中
目录 1.把日志信息保存到文件中 2.拓展 (1)观察代码 (2)提出问题 (3)问题说明 1.把日志信息保存到文件中 代码如下所示: """ logging模块是Pyt ...
- python pickle模块的使用/将python数据对象序列化保存到文件中
# Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...
- Android输出日志Log类并保存到文件中
android.util.Log常用的方法有以下5个: Log.v() Log.d() Log.i() Log.w() 以及 Log.e().根据首字母分别对应VERBOSE,DEBUG,INFO,W ...
随机推荐
- Google Maps 学习笔记(一)2014.06.04
1.<body onload="加载地图的函数" onunload="GUnload()"> 2.new GMap2(container,opts) ...
- BZOJ 1997: [Hnoi2010]Planar( 2sat )
平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...
- 如何实现HTTPSERVER
Write your own http server author : Kevin Lynx Why write your own? 看这个问题的人证明你知道什么是http server,世界上有很多 ...
- scrapy写爬虫是出现no module named win32api错误
windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...
- ASP.Net MVC3 - The easier to run Unit Tests by moq #Reprinted#
From: http://www.cnblogs.com/techborther/archive/2012/01/10/2317998.html 前几天调查完了unity.现在给我的任务是让我调查Mo ...
- Qt容器类的对象模型及应用(线性结构篇)(好多图,比较清楚)
用Qt做过项目开发的人,肯定使用过诸如QList.QVector.QLinkList这样的模板容器类,它们虽然名字长的不同,但使用方法都大致相同, 因为其使用方法都大体相同,很多人可能随便拿一个容器类 ...
- USACO 2001 OPEN
第1题 绿组. 奶牛接力赛[relay] 题目描述 农夫约翰已经为一次赛跑选出了K(2≤K≤40)头牛组成了一支接力队.赛跑在农夫约翰所拥有的农场上进行,农场的编号为1到Ⅳf4≤Ⅳ< 800), ...
- SSH 配置日记
1 注意struts2-spring-plugin.jar的导入. Unable to load configuration. - action 异常.需要导入这个包 2 很久都跑不通的 ...
- 【Java线程】Lock、Condition
http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java内存模型(五)——锁 http://www.ibm.com/develope ...
- Mybatis 简单的CRUD 基于XML文件配置
全部的ORM框架学习曲线都是先来一个CRUD爽一爽,以下我们就来CRUD一下,全部的配置都是基于上一篇的配置.废话不多说,直接上代码. <?xml version="1.0" ...