归解档
2018-02-02 本文已影响0人
天蓬大元
归解档操作的对象必须遵守<NSCoding>,因为归解档是通过该协议实现的。无论是系统的类还是我们自定义的类,想要进行归解档操作,就必须要遵守该协议。本文我们以自定义类为例子,对归解档进行基本的解读。
一,归档
什么是归档,归档就是将当前对象转化为二进制数据并存储到指定的文件中。
来来来,热乎的代码
我们将归档数据存储在Documents文件夹中的data.txt文件中
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path = [paths objectAtIndex:0];
NSString *prePath = [path stringByAppendingPathComponent:@"/data.txt"];
在开始归档之前,我们必须保证我们操作的自定义类是可以归档的。
自定义Person类
#import <Foundation/Foundation.h>
//遵守归档协议<NSCoding>
@interface Person : NSObject<NSCoding>
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@end
#import "Person.h"
@implementation Person
//归档,实现归档协议的方法
- (void)encodeWithCoder:(NSCoder *)coder
{
NSLog(@"进入归档");
//将name属性进行归档;key自定义,解档时要完全匹配
[coder encodeObject:_name forKey:@"name"];
[coder encodeInteger:_age forKey:@"age"];
}
//解档,实现解档协议的方法
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [[Person alloc] init];
if (self) {
NSLog(@"进入解档");
//获取解档的属性值
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeIntegerForKey:@"age"];
}
return self;
}
@end
我们接下来的归档操作,就是针对Person的一个对象进行
//先创建一个对象,并对其属性进行赋值。
Person *xiaoM = [[Person alloc] init];
xiaoM.name = @"xiaoMing";
xiaoM.age = 18;
//NSKeyedArchiver:归档
//参数1: 归档内容 参数2: 归档的路径
//archiveRootObject:归档到文件->encodeWithCoder
if([NSKeyedArchiver archiveRootObject:xiaoM toFile: prePath])
{
NSLog(@"归档成功");
}
二,解档
//NSKeyedUnarchiver: 接档类
//unarchiveObjectWithFile: 从文件中获取对象->initWithCoder
Person *obj = [NSKeyedUnarchiver unarchiveObjectWithFile: prePath];
三,归解档数据流
//归档到数据流->encodeWithCoder
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:xiaoM];
Person *obj2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];