IOS三种归档(NSKeyArchieve)的总结
IOS三种归档(NSKeyArchieve)的总结
归档是一种IOS中常用来存储文件的一种方法,在面向对象的语言中,归档也就实际上可以将一切对象存储在文件中,以下是IOS开发中常见的三种文件归档方式,分别是简单归档、data归档、自定义归档。现分别总结如下:
1、简单归档:
简单归档是指把简单的字符串、数组等对象进行归档。用到的方法是archiveRootObject,语句为 [NSKeyedArchiver archiveRootObject:array toFile:path];
其中红色的array是我们要归档的数组,path是要把array归档到的文件,也就是说我们需要先有这个array,以及先创建好path。
Array的创建(在实际使用中通常是已经对已经有的东西进行归档,所以不需要创建):NSArray *array = @[@"1",@"2",@"3"];
Path:path是沙盒中的文件,所以我们先要在沙盒中创建这么一个文件,但是在归档的语句中会自动根据路径和文件名创建这个文件,所以我们只需要先定义出一个文件路径,语句是:
NSString *path = [NSString stringWithFormat:@"%@/Documents/myfile.mp3",NSHomeDirectory()];
通过这种方式归档的对象,可以通过NSKeyedUnarchiver去解归档
归档过程和解归档的完整的代码如下:
// 初始化需要归档的数组
NSArray *array = @[@"",@"",@""]; // 创建归档文件的路径
NSString *path = [NSString stringWithFormat:@"%@/Documents/myfile.mp3",NSHomeDirectory()]; // 归档
[NSKeyedArchiver archiveRootObject:array toFile:path]; // 解归档
NSArray *array1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
// 打印
NSLog(@"%@",array1);
2、data归档
这种归档方式是先新建一个可变的data对象,然后通过创建一个NSKeyedArchiver实例对象对各种类型的数据进行归档到data的归档文件中,归档方法为
encodeObject: forKey:这样的方法。具体的操作过程见以下代码:
// data归档 // 创建一个文件路径
NSString *pathdata = [NSString stringWithFormat:@"%@/Documents/a.mp3",NSHomeDirectory()]; // 创建一个可变data
NSMutableData *datanow = [[NSMutableData alloc]init]; // 创建一个归档实例,路径为之前创建的文件路径
NSKeyedArchiver *keyarch = [[NSKeyedArchiver alloc]initForWritingWithMutableData:datanow]; // 归档
[keyarch encodeObject:@"hahha" forKey:@"one"];
[keyarch encodeInteger: forKey:@"two"];
[keyarch finishEncoding]; [datanow writeToFile:pathdata atomically:YES]; // 解归档
NSData *dataout = [NSData dataWithContentsOfFile:pathdata]; NSKeyedUnarchiver *unarch = [[NSKeyedUnarchiver alloc]initForReadingWithData:dataout]; NSString *stringone = [unarch decodeObjectForKey:@"one"];
NSInteger x = [unarch decodeIntegerForKey:@"two"];
NSLog(@"%@,%ld",stringone,(long)x);
3、自定义归档:
如果某一个对象有多个属性值,那么我们如果对这些值分别进行归档的话,会很麻烦,而且要使用这些数据的话,解归档的过程也会很麻烦,最好的办法就是把整个对象的属性变量归档到一个对象的归档文件中,然后解归档的时候也是整个对象一起解归档,然后想用什么属性值就可以直接使用了。
这样我们就要先定义一个类User,这个类首先要遵守NSCoding协议,这个类有两个属性,分别是name和age。以下是.h文件:
// User.h
#import <Foundation/Foundation.h> //遵守NSCoding协议
@interface User : NSObject<NSCoding>
//定义属性name和age
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *age; @end
然后在.m文件中重写一个归档方法,一个解归档方法,以及一个description方法:
// User.m #import "User.h" @implementation User //重写归档方法,把调用者的属性进行归档
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.age forKey:@"age"];
[aCoder encodeObject:self.name forKey:@"name"];
} //重写解归档方法,把属性赋值给新对象的对应属性
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.age = [aDecoder decodeObjectForKey:@"age"];
self.name = [aDecoder decodeObjectForKey:@"name"];
}
return self;
} //重写description方法,打印对象时可直接调用此函数
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ %@", self.name,self.age];
} @end
以上description方法重写之后,当使用NSLog方法打印User对象时,就会直接调用此方法,也就是会打印self.name,self.age。
- (void)viewDidLoad {
[super viewDidLoad];
代码;
}
然后在以上的代码位置处写入代码段:
// 初始化对象
User *myUser = [[User alloc]init];
myUser.age = @"";
myUser.name = @"bearapp.me"; // 定义归档文件路径
NSString *pathdata = [NSString stringWithFormat:@"%@/Documents/myUser.mp3",NSHomeDirectory()]; // 调用对象的归档方法
[NSKeyedArchiver archiveRootObject:myUser toFile:pathdata]; // 调用解归档方法
User *userout = [NSKeyedUnarchiver unarchiveObjectWithFile:pathdata];
NSLog(@"%@",userout);
以上代码段创建了一个User对象,并使用点语法给这个对象的两个属性赋值,赋值完成后,定义了一个归档路径文件,并使用NSKeyedArchiver把这个对象归档到归档文件中。这样就完成了整个对象的归档。
通过NSKeyedUnarchiver调用unarchiveObjectWithFile:pathdata方法可以完成对应pathdata的解归档,并赋值给一个对象,然后打印整个对象。
由于我们重写了description 方法,所以在使用NSLog()方法打印对象时会分别打印对象的两个属性,打印输出如下:
2016-04-13 14:28:17.195 自定义归档[44181:2130618] bearapp.me 234
IOS三种归档(NSKeyArchieve)的总结的更多相关文章
- iOS 三种录制视频方式
随着每一代 iPhone 处理能力和相机硬件配置的提高,使用它来捕获视频也变得更加有意思.它们小巧,轻便,低调,而且与专业摄像机之间的差距已经变得非常小,小到在某些情况下,iPhone 可以真正替代它 ...
- 根据分析查看相关知识点分析iOS 三种录制视频方式
这篇文章讨论了关于如何配置视频捕获管线 (pipeline) 和最大限度地利用硬件性能的一些不同选择. 这里有个使用了不同管线的样例 app,可以在 GitHub 查看. 第一种:UIImagePic ...
- iOS 三种收起键盘的方法
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- iOS:三种数据库的小总结
三种数据库总结:sqlite.FMDB.CoreData 1.sqlite数据库(C语言)需要方法和属性: (1)数据类型: –INTEGER 有符号的整数类型 –REAL 浮点类型 –TEXT ...
- iOS三种定时器的用法NSTimer、CADisplayLink、GCD
一,NSTimer //创建方式1 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector: ...
- iOS 三种定时器
http://www.cocoachina.com/ios/20160905/17482.html
- iOS三种正则表达式
1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @"nijino_saki@.com": NSString *regex = @ ...
- ios 三种对话框拉伸方法
- iOS 三种打电话方式
//1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 NSMutableString * str=[[NSMutableString alloc] initWit ...
随机推荐
- 转:Jmeter 用户思考时间(User think time),定时器,和代理服务器(proxy server)
在负载测试中需要考虑的的一个重要要素是思考时间(think time), 也就是在两次成功的访问请求之间的暂停时间. 有多种情形挥发导致延迟的发生: 用户需要时间阅读文字内容,或者填表,或者查找正确的 ...
- VS2013编译FileZilla0.9.44
2014年,FileZilla更新了一下,到了44版本了,貌似也是用VS2013的工程做的项目,所以下载了server的安装包,然后安装SourceCode即可(需要安装InterFace,是安装必选 ...
- ubuntu 解压 windows 生成的 zip 文件乱码问题
在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码. 有两种方式解决问题:(建议采用方法 ...
- DNS开源服务器BIND最小配置详解<转>
一,简介 相对于存储和大数据领域,CDN是一个相对小的领域,但行行出状元,BIND就是CDN领域的蝉联N届的状元郎.BIND是一款非常常用的DNS开源服务器,全球有90%的DNS用BIND实现.值得一 ...
- github 教程
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/
- C# 经典入门12章-System.Collections.Generic命名空间
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtUAAAAsCAIAAAAl09PEAAAgAElEQVR4nOx95Vscyd7285cMPrg7Aw ...
- C#入门经典第十章类的成员-1
类成员的访问级别 public 成员可以由任何代码访问,公共的. private 私有的,成员只能有类中的代码访问.(默认的关键字) internal 内部的,成员只能有定义它的程序集(项目)内部 ...
- SPOJ Count on a tree
Count on a tree Time Limit:129MS Memory Limit:1572864KB 64bit IO Format:%lld & %llu Subm ...
- java.lang.RuntimeException: java.lang.NoSuchMethodException:
[java] 15/12/19 14:09:46 INFO mapred.JobClient: Task Id : attempt_201512182036_0017_m_000000_0, Stat ...
- make[1]: *** [/workopenwrt/trunk/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory `/work/openwrt/trunk' make: *** [world]
主要原因是编译时未连上网,编译时需要下载些插件,连接网后,重启下系统再编译下.