Archiver是持久化数据的一种方式,他跟 Plist的差别在于他能持久化自己定义对象。但他没Plist那么方便。

Archiver默认能持久化的数据有NSNumber,NSArray,NSDictionary,NSString,NSData,由于这几个对象已经实现了

<NSCoding>协议。如果我们要实现一个对象的Archiver持久化 ,也必须实现该对象。

1.<NSCoding>协议主要为归档/恢复文件两个方法

//恢复归档文件为对象
-(id)initWithCoder:(NSCoder *)aDecoder
//归档,使对象持久化
-(void)encodeWithCoder:(NSCoder *)aCoder

----------------

例如以下 。我们首先获取归档文件的路径

#pragma mark 获取文件路径
- (NSString *) filePath
{
NSArray *dirPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSAllDomainsMask, YES);
NSString *dirPath=dirPaths[0];
NSString *filePath=[dirPath stringByAppendingPathComponent:@"aa.archiver"];
return filePath;
}

2.系统默认对象怎样归档(NSNumber,NSArray,NSDictionary,NSString,NSData)

#pragma mark 归档/恢复 Array对象
- (void) savearray
{ NSString *filePath=[self filePath];
//
// NSArray *arr=@[@"ttt",@"BBB",@25];
// [NSKeyedArchiver archiveRootObject:arr toFile:filePath];
//
NSArray *arr1=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",arr1);
}
#pragma mark 归档/恢复 Dictionary对象
- (void) saveDic
{
NSString *filePath=[self filePath];
// NSDictionary *dict=@{@"name":@"lean",@"age":@25};
// BOOL flag=[NSKeyedArchiver archiveRootObject:dict toFile:filePath];
// NSLog(@"%d",flag);
NSDictionary *dict2=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",dict2);
}

3.怎样归档自己定义对象。

定义了一个Person类。例如以下:

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age; + (Person *) initWithName:(NSString *)name andAge:(int) age; @end #import "Person.h" @implementation Person + (Person *) initWithName:(NSString *)name andAge:(int) age
{
Person *p=[[Person alloc] init];
p.name=name;
p.age=age;
return p;
} -(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInt:self.age forKey:@"age"];
} -(id)initWithCoder:(NSCoder *)aDecoder
{
[self setName:[aDecoder decodeObjectForKey:@"name"]];
[self setAge:[aDecoder decodeIntForKey:@"age"]];
return self;
} @end

TIP: 无论是encode还是decode 都是依据对象的类型去选用不同的方法。如

encodeInt:forkey:      encodeDouble:forkey:   encodeFloat:forkey:

decodeObjectForKey:  decodeIntForKey:  decodeDoubleForKey:

NSKeyedArchiver archiveRootObject:toFile:

NSKeyedUnarchiver unarchiveObjectWithFile:

各自是对须要归档。

恢复的对象进行操作的两个类

定义完了Person类后,在须要归档的地方调用例如以下:

#pragma mark 归档/恢复 自己定义对象
- (void) savePerson
{
NSString *filePath=[self filePath];
Person *p=[Person initWithName:@"lean" andAge:22];
BOOL flag=[NSKeyedArchiver archiveRootObject:p toFile:filePath];
Person *p2=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%d-%d",flag,p2.age);
}

对于其Person类,如果该类中还有自己定义对象作为属性。相同实现<NSCoding>协议

4.如果该对象是某个对象子类,这里我们建立一个叫Student类作为Person的子类

#import "Person.h"

@interface Student : Person

@property (nonatomic ,assign) int no;

+ (Student *) initWithName:(NSString *)name andAge:(int) age andNO:(int) no;

@end

相同Student也须要实现NSCoding协议的方法

-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super initWithCoder:aDecoder]) {
[self setNo:[aDecoder decodeIntForKey:@"no"]];
}
return self;
} -(void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeInt:self.no forKey:@"no"];
}
#pragma mark 归档/恢复 自己定义子类对象
- (void) saveStudent
{
NSString *filePath=[self filePath];
Student *p=[Student initWithName:@"lean" andAge:22 andNO:150133];
BOOL flag=[NSKeyedArchiver archiveRootObject:p toFile:filePath];
Student *p2=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%d-%@",flag,p2.name);
}

IOS-Archiver文件归档(2)的更多相关文章

  1. iOS:文件归档和解归档的详解和使用

    文件归档和解归档: 用途: 所谓文件归档,就是把需要存储的对象数据存储到沙盒的Documents目录下的文件中,即存储到了磁盘上,实现数据的持久性存储和备份.解归档,就是从磁盘上读取该文件下的数据,用 ...

  2. IOS三种归档(NSKeyArchieve)的总结

    IOS三种归档(NSKeyArchieve)的总结 归档是一种IOS中常用来存储文件的一种方法,在面向对象的语言中,归档也就实际上可以将一切对象存储在文件中,以下是IOS开发中常见的三种文件归档方式, ...

  3. iOS应用文件夹

    IOS5多了一个比较重要的功能iCloud,但是同时也出现一个问题,很多的APP都把很大量的数据存在APP底下的Documents(/Documents )文件夹里面,这样苹果会reject掉你的AP ...

  4. linux专题一之文件归档和压缩(tar、file、zip)

     本文主要从以下几个方便来说明文件的归档和压缩,同时比较几种不同压缩方法的压缩比率及特点. 文件归档命令tar,tar.gz源码包的安装管理 创建tar包-解压-查询tar包内容 zip命令的用法 为 ...

  5. iOS: Crash文件解析(一)

    iOS Crash文件的解析(一) 开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退.脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断. ...

  6. iOS 获取文件的目录路径的几种方法 [转]

    iOS 获取文件的目录路径的几种方法 2 years ago davidzhang iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. d ...

  7. RHEL7文件归档与压缩

    本文介绍RHEL7.2文件的归档和压缩 文件归档 归档的好处:方便使用.查询.阅读,易于管理 (批量删除文件) 常用操作 命令:tar 作用:将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中 ...

  8. iOS Crash文件的解析

    iOS Crash文件的解析 开发程序的过程中不管我们已经如何小心,总是会在不经意间遇到程序闪退.脑补一下当你在一群人面前自信的拿着你的App做功能预演的时候,流畅的操作被无情地Crash打断.联想起 ...

  9. iOS: 获取文件路径

    iOS: 获取文件路径   // 例如 - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectories ...

  10. iOS实现文件上传功能模块

    iOS实现文件上传功能,首先要知道的是,上传到服务器的数据格式,一般采用HTTP文件上传协议.如下图 如图所示,只要设置好了HTTP的协议格式,就可以实现文件上传功能. 代码如下: //图片上传模块 ...

随机推荐

  1. zepto源码学习-05 ajax

    学习zeptoajax之前需要先脑补下,强烈推荐此文http://www.cnblogs.com/heyuquan/archive/2013/05/13/js-jquery-ajax.html 还有A ...

  2. 深度观察:腾讯收购大众点评背景下的O2O大格局

    [亿欧导读] 腾讯入股大众点评获得20%股权,详情解读:①大众点评:独立自主为底线,要钱大于要流量:②腾讯:承认原生活服务O2O失败,丰富移动支付应用场景:③美团承受压力,拉手窝窝继续苦等买家:④BA ...

  3. ASP.NET MVC 入门介绍 (上)

    MVC模式 MVC模式是一种软件架构模式.它把软件系统分为三个部分:模型(Model),视图(View)和控制器(Controller).MVC模式最早由Trygve Reenskaug在1974年提 ...

  4. [wikioi]线段覆盖

    http://wikioi.com/problem/1214/ 这道题也归为贪心了.我也不是很能分辨,但想法确实是:1.有阶段最优化性:2.前一状态和后一状态有关系. 想法:1.排个序是很自然的想法, ...

  5. Android-相册效果(图片缩放 自由滑动)

    先上图: 很多时候 我们会有这么一个需求: 展示一组图片 每个Item的图片 可以自由拉伸 滑动 焦点不冲突 网上有很多实现方法 通过自定义Gallery和ImageView来实现 个人不是很推荐 在 ...

  6. jstring 和char 之间的转换方法

    //jstring to char* char* jstringTostring(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsst ...

  7. 如何使用GetManifestResourceStream

    在做开发时想要从程序集中加载一个xml文件数据,可是在运行后确取不到值,值始终是null. 代码如下: Stream ss = this.GetType().Assembly.GetManifestR ...

  8. git获取远端版本库上的Tag (没有clone[远端的版本库太大了])

    方法一 http://stackoverflow.com/questions/25815202/git-fetch-a-single-commit The git fetch command deli ...

  9. 教程 打造OS X Mavericks原版 EFI Clover 引导安装

    自从 Mavericks 10.9 发布DP版到现在的GM版以来,以前Clover引导原版InstallESD.dmg方式安装原版的方法已经不能使用,而且已经不能引导安装了,所以从GM版发布以前,终于 ...

  10. Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...