前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激.
承接上篇博客我们来看看IOS开发中是如何将一个自定义的对象进行归档的
本篇博客将介绍以下几个方面的内容

1)普通的单个对象归档操作
2)拥有继承关系的对象归档
3)同时将多个对象进行归档

1.普通的单个对象归档操作
首先我们来看下最简单的单个对象归档操作
1.自定义一个跟小明一样有名的类(Person)

直接上代码 :

Person.h

 #import <Foundation/Foundation.h>

 @interface Person : NSObject<NSCoding>

 /**
* 姓名
*/
@property (nonatomic, strong) NSString *name ; /**
* 地址
*/
@property (nonatomic, strong) NSString *address ; /**
* 年龄
*/
@property (nonatomic, assign) int age; -(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age;//初始化方法 @end

Person.m

 #import "Person.h"

 @implementation Person

 -(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age{
if (self = [super init]) {
self.name = name;
self.address = address;
self.age = age;
}
return self;
} //告知编译器,我们需要归档当前对象的哪些属性
-(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.address forKey:@"address"];
[aCoder encodeInt: self.age forKey:@"age"];
} //告知编译器,解档时对应的属性
-(instancetype)initWithCoder:(NSCoder *)aDecoder{ self.name = [aDecoder decodeObjectForKey:@"name"];
self.address = [aDecoder decodeObjectForKey:@"address"];
self.age = [aDecoder decodeIntForKey:@"age"];
return self;
} //重写description,方便调试查看对象属性信息
-(NSString *)description{
return [NSString stringWithFormat:@"name : %@, address : %@,age : %d",self.name,self.address,self.age];
} @end

控制器代码1:归档

 -(void)personArchive{
//创建及初始化对象
Person *p = [[Person alloc] initWithName: @"jack" address:@"Mars" age:]; //定义归档路径
NSString *fullPath = [self fullPathWithFileName:@"person.data"]; //进行归档
[NSKeyedArchiver archiveRootObject:p toFile:fullPath]; NSLog(@"对象归档成功");
}

控制器代码2:解档

 -(void)personUnarchive{
//指定路径
NSString *fullPath = [self fullPathWithFileName:@"person.data"];
//解档操作
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:fullPath];
//打印结果
NSLog(@"%@",p); }

注: fullPathWithFileName: 方法为便捷获取路径方法,代码如下

 -(NSString *)fullPathWithFileName:(NSString *)fileName{

     NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//拼接完整路径并返回
return [documentDir stringByAppendingPathComponent:fileName]; }

依次调用我们的归档和解档方法

 [self personArchive];//归档
[self personUnarchive];//解档

结果如下:

至此我们已经实现了简单的单个对象的归档和解档操作,下面我们来看下继承关系下的对象的归档解档操作

2.拥有继承关系的对象归档和解档

定义一个Student类继承自Person类,代码如下

Student.h

 #import "Person.h"

 @interface Student : Person

 /**
* 学校名称
*/
@property (nonatomic, strong) NSString *schoolName;
//快速初始化方法
-(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age schoolName:(NSString *)schoolName; @end

Student.m

 #import "Student.h"

 @implementation Student

 -(instancetype)initWithName:(NSString *)name address:(NSString *)address age:(int)age schoolName:(NSString *)schoolName{
if (self = [super initWithName:name address:address age:age]) {
self.schoolName =schoolName;
}
return self;
} -(void)encodeWithCoder:(NSCoder *)aCoder{ [super encodeWithCoder:aCoder]; [aCoder encodeObject:self.schoolName forKey:@"schoolName"];
} -(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
self.schoolName = [aDecoder decodeObjectForKey:@"schoolName"];
return self;
} //重写description,方便调试查看属性信息
-(NSString *)description{ //先拿到父类拥有的属性描述
NSString *str = [super description];
//添加子类特有的描述,返回
return [str stringByAppendingString:[NSString stringWithFormat:@",schoolName : %@",self.schoolName]];
}
@end

控制器方法1:归档

 -(void)studentArchive{
//声明一个子类对象
Student *stu = [[Student alloc] initWithName:@"小明" address:@"走廊" age: schoolName:@"剑桥大学"];
//定义路径
NSString *fullpath = [self fullPathWithFileName:@"stu.data"];
//归档操作
[NSKeyedArchiver archiveRootObject:stu toFile:fullpath]; NSLog(@"归档成功");
}

控制器方法2:解档

 -(void)studentUnarchive{

     NSString *fullpath = [self fullPathWithFileName:@"stu.data"];//指定路径
Student *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:fullpath];//解档
NSLog(@"%@",stu);//打印信息
}

依次调用上述两个方法,运行结果如下

3.同时将多个对象归档

演示代码如下:

1.归档

 -(void)multipleArchive{
//创建并初始化两个对象
Student *s0 = [[Student alloc]initWithName:@"name0" address:@"address0" age: schoolName:@"schoolName0"];
Student *s1 = [[Student alloc]initWithName:@"name1" address:@"address1" age: schoolName:@"schoolName1"]; //创建一个NSMutableData对象
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];//关联 [archive encodeObject:s0 forKey:@"student0"];
[archive encodeObject:s1 forKey:@"student1"]; [archive finishEncoding];
//指定路径
NSString *fullpath = [self fullPathWithFileName:@"multiple.data"];
//到这一步数据已缓存到data中,将其写入文件
[data writeToFile:fullpath atomically:YES]; NSLog(@"多对象归档成功"); }

02.解档:

 -(void)multipleUnArchive{

     NSString *fullpath = [self fullPathWithFileName:@"multiple.data"];//指定路径
NSData *data = [NSData dataWithContentsOfFile:fullpath];//将数据解析成NSData对象
NSKeyedUnarchiver *unArchive = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];//关联
Student *stu0 = [unArchive decodeObjectForKey:@"student0"];
Student *stu1 = [unArchive decodeObjectForKey:@"student1"];
[unArchive finishDecoding];
NSLog(@"%@",stu0);
NSLog(@"%@",stu1); }

运行结果如下图:

4.分析与简单总结
1.将一个对象归档的前提:

遵守NSCoding协议
实现两个方法:
encodeWithCoder://指定需要归档的属性
initWithCoder://指定需要解档的属性

2.继承关系的对象归档注意:

在实现上述两个方法的时候记得调用其父类的方法
eg:
[super encodeWithCoder:aCoder];
self = [super initWithCoder:aDecoder];

3.多对象归档依赖于:NSData对象

IOS开发--数据持久化篇文件存储(二)的更多相关文章

  1. IOS开发--数据持久化篇之文件存储(一)

    前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...

  2. iOS开发——数据持久化Swift篇&通用文件存储

    通用文件存储 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...

  3. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  4. iOS开发——数据持久化Swift篇&(二)沙盒文件

    沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...

  5. iOS开发——数据持久化Swift篇&iCloud云存储

    iCloud云存储 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super. ...

  6. iOS开发——数据持久化OC篇&plist文件增删改查操作

    Plist文件增删查改   主要操作: 1.//获得plist路径    -(NSString*)getPlistPath: 2.//判断沙盒中名为plistname的文件是否存在    -(BOOL ...

  7. iOS开发——数据持久化&本地数据的存储(使用NSCoder将对象保存到.plist文件)

    本地数据的存储(使用NSCoder将对象保存到.plist文件)   下面通过一个例子将联系人数据保存到沙盒的“documents”目录中.(联系人是一个数组集合,内部为自定义对象).   功能如下: ...

  8. iOS开发——数据持久化Swift篇&(三)SQLite3

    SQLite3 使用 //******************** 5.3 SQLite3存储和读取数据 func use_SQLite3() { //声明一个Documents下的路径 var db ...

  9. iOS开发——数据持久化Swift篇&(一)NSUserDefault

    NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...

随机推荐

  1. next_permutation()函数 和 prev_permutation() 按字典序求全排列

    next_permutation功能:    求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm> 与之完全相反的函数还有prev_permutation 这个 ...

  2. (转)博弈问题与SG函数

    博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...

  3. 高斯消元与xor方程组

    ;i<=n;i++) { ;j<=n;j++) if(a[j]>a[i]) swap(a[i],a[j]); if(!a[i]) break; ;j>=;j--) ) { ;k ...

  4. BZOJ2226: [Spoj 5971] LCMSum

    题解: 考虑枚举gcd,然后问题转化为求<=n且与n互质的数的和. 这是有公式的f[i]=phi[i]*i/2 然后卡一卡时就可以过了. 代码: #include<cstdio> # ...

  5. IIS没有ASP.NET选项卡

    问题: 1.IIS没有ASP.NET选项卡 2.默认文档不起作用 分析: 1,在安装了.net framework 2.0后,iis站点属性里才会有asp.net的选项. 2,安装asp.net2.0 ...

  6. 五大主流SQL数据库

    一. 开放性 1. SQL Server 只能在windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的.Windows9X系列产品是偏重于桌面应用,NT server只适合中 ...

  7. UVA 11090 Going in Cycle!!(二分答案+判负环)

    在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...

  8. 随机森林与GBDT

    前言: 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时,单决策树又有一些不好的地方,比如说容易over- ...

  9. 开源的rtsp实现

    开源的rtsp实现                            ============== -- by BeagleTam                                  ...

  10. 当ASP.NET MVC模型验证遇上CKEditor

    项目需要,使用到了CKEditor编辑器.这是个很不错的富文本编辑器,但是当它绑定的字段需要进行模型验证的时候,却会出现验证失效的问题.因此本文旨在记录这个问题和给出解决办法.以下以Validatio ...