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 保存到文件中的更多相关文章

  1. Python3操作MySQL,查询数据并保存到文件中

    我们在测试过程中,可能需要到数据库中拉去一些数据,为从测试准备.比如最近在做接口性能测试的时候,就需要很多数据来支撑,所以就需要的数据库去查询数据,下面就是python3 查询 mysql 并且保存到 ...

  2. Java将对象保存到文件中/从文件中读取对象

    1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Obje ...

  3. php cUrl模拟登录,cookie保存到文件中

    源码如下: <?php header("Content-Type:text/html;charset=utf-8"); //模拟群友通讯录手机号登录 $curl = curl ...

  4. jmeter 发送http请求,并把获取到的请求的订单信息保存到文件中

    有一个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是用jmeter 发送http请求,使用正则表达式获取到订单号,并把订单号和线程号作为参数提供给java请求,在java请求 ...

  5. 谷歌浏览器修改CSS和js后同步保存到文件中 (译)

    本文标题:谷歌浏览器修改CSS和js后同步保存到文件中. 文本作者:魔芋铃. 英文原文:http://www.stephensaw.me/google-chrome-devtools-source-m ...

  6. 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...

  7. 『无为则无心』Python日志 — 66、将日志信息保存到文件中

    目录 1.把日志信息保存到文件中 2.拓展 (1)观察代码 (2)提出问题 (3)问题说明 1.把日志信息保存到文件中 代码如下所示: """ logging模块是Pyt ...

  8. python pickle模块的使用/将python数据对象序列化保存到文件中

    # Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...

  9. Android输出日志Log类并保存到文件中

    android.util.Log常用的方法有以下5个: Log.v() Log.d() Log.i() Log.w() 以及 Log.e().根据首字母分别对应VERBOSE,DEBUG,INFO,W ...

随机推荐

  1. Android studio 开发在真机测试

    真机测试 首先按照这设置android studio:   http://jingyan.baidu.com/article/fea4511a75d627f7ba912540.html 2.打开and ...

  2. jQuery实现页面关键字搜索

    <style type="text/css"> .highlight { background-color:yellow; } </style> <s ...

  3. sql--关于exec和sp_execute

    sql:exec与sp_excutesql的比较 exec与sp_execute都可以执行存储过程和批处理动态sql语句,以下所属均是关于批处理动态sql语句方面. 一.关于输入参数与输出参数 1.使 ...

  4. 简单天气应用开发——解析HeWeather JSON

    借助和风天气API成功获取到了我想要的天气信息,但在怎么提取出我想要的数据上又遇到了问题. {"HeWeather data service 3.0":[{"basic& ...

  5. php生成数据字典,代码

    <?php /** * 生成mysql数据字典 */ header("Content-type:text/html;charset=utf-8"); // 配置数据库 $da ...

  6. 7.PHP 教程_PHP常量

    常量值被定义后,在脚本的其他任何地方都不能被改变. PHP常量 常量是一个简单值的标识符.该值在脚本中不能改变. 一个常量由英文字母.下划线.和数字组成,但数字不能作为首字母出现.(常量名不需要加$修 ...

  7. OutputDebugString 输出信息到调试器

    #include <Windows.h>#include <stdio.h>#include <stdarg.h> void __cdecl odprintf(co ...

  8. win7下文件名不能定义为con(任何文件格式)

    从linux传输压缩包到win7下解压缩,总是提示出错,可是在linux下解压都很正常,于是定位出错的文件,发现是con.c和con.h文件,经排查,原因如下: CON是DOS下的特殊设备名 如下由系 ...

  9. NET Core Docker部署

    NET Core Docker部署 前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行 ...

  10. NET Core个人博客

    NET Core重写个人博客站点小结 今天用ASP.NET Core重写了个人博客站点,原来是基于ASP.NET 4.5开发的.重写工作总体很顺利,最后成功发布到Ubunt+Nginx平台上.效果如下 ...