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 ...
随机推荐
- UITextView 限制输入字数
尊重原创 http://blog.csdn.net/fengsh998/article/details/45421107 对于限制UITextView输入的字符数.相信大家在网上见得最多的是实现UI ...
- C# 课堂总结3-语句
一.顺序语句 二.条件,分支语句 1.if语句 关键是能够熟练运用 if的嵌套.要考虑好所有的情况. 如果说 条件是两种+情况相互对应的,那么就可以只用 if 与else .但必须要想好 每个else ...
- 求新的集合 A=AUB(顺序表)
#include<stdio.h> typedef int A; const int LIST_INIT_SIZE=100; const int LISTINCREMENT=10; typ ...
- JQuery中的倒计时
//一分钟后执行xianshi这个事件 setTimeout(function() {xianshi();}, ); //0.1秒执行一次xianshi这个事件 setInterval(functio ...
- mysql中varchar最长多少
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字.字母还是UTF8 ...
- Java "==和equals区别" 示例
import java.util.Calendar; import java.util.Date; import java.util.Locale; public class test { publi ...
- 关于类似于自动填充搜索框的DEMO
接了个单子,客户要求左边输入时,右边自动到数据库查出对应内容,如果是单个INPUT还好,这个是动态增加INPUT,不过都是一样,关键是思路 这里遇到最郁闷的问题,就是我用的JQ1.9 以前用的JQ1. ...
- IList, ICollection ,IEnumerable AND IEnumerator in C#
IList, ICollection ,IEnumerable 很显然,这些都是集合接口的定义,先看看定义: // 摘要: // 表示可按照索引单独访问的对象的非泛型集合. [ComVisible(t ...
- 从51跳cortex-m0学习2——程序详解
跳cortex-m0——思想转变>之后又一入门级文章,在此不敢请老鸟们过目.不过要是老鸟们低头瞅了一眼,发现错误,还请教育之,那更是感激不尽.与Cortex在某些操作方式上的异同,让自己对Cor ...
- HDU 2815 Mod Tree
不会,先搁着…… http://blog.csdn.net/acm_cxlove/article/details/7832197