首先说明归解档是一种编码方式,不是数据本地化的方式,在复杂对象写入本地的时候实际上使用的还是writeToFile 的简单写入本地的方法,且WtiteToFile 直接写入本地,是整存整取的 在一个路径下存数据,最后一次存进去的东西会覆盖掉之前的,下面我们通过上述两内容实现复杂对象的写入.
本文内容:
一.对Foundation框架中的对象进行归档
二.对自定义的对象进行归档
三.对自定义内容进行归档
注意: 归档生成的文件是加密文件(是不可解)
首先创建一个person类
Person.h文件
@interface Person : NSObject<NScoding>
//如果一个对象想实现直接写入本地,那么这个对象就要遵守<NSCoding>协议
//声明属性
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *sex;
@property(nonatomic,assign)NSUInteger age;
@end```
###Person.m文件
```code
#import "Person.h"
@implementation Person
//在归档和解档的时候,要把所有的属性都进行归解档
//归档
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex forKey:@"sex"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
//解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
@end```
然后在视图控制器ViewController中操作
###ViewController.m 文件中
```code
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//如果一个对象想直接写入本地,那么这个对象就要遵守NSCoding协议,上面已经说过,一定记住哦
//获取要存储数据的主路经(具体参数前面有解释)
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
//创建Person对象,做存储的数据
Person *person = [[Person alloc] init];
person.name = @"班长";
person.sex = @"女";
person.age = 10;
#pragma mark-----对自定义对象进行归档和反归档----
//第一步:创建一个NSMutableData 用于初始化归档工具
NSMutableData *data = [NSMutableData data];
//第二步:创建一个归档工具
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//第三步:使用归档工具 对需要归档的对象进行归档
[keyedArchiver encodeObject:person forKey:@"person"];
NSLog(@"---%@",data);
//第四步:结束归档(只有在结束归档之后数据才能得到有效保存)
[keyedArchiver finishEncoding];
NSLog(@"---%@",data);
//写入文件(确定具体的文件)
NSString *dataPath = [documentPathStr stringByAppendingPathComponent:@"data.plist"];
//写入文件(写入)
[data writeToFile:dataPath atomically:YES];
NSLog(@"%@",documentPathStr);
#pragma mark-----解档---
//第一步:从本地获取到的Data
NSData *newData = [NSData dataWithContentsOfFile:dataPath];
NSLog(@"newData = %@",newData);
//第二步:通过获取到的data,创建解档工具
NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:newData];
//第三步:创建一个person对象,接收解档结果
Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];
//第四步:结束解档
[keyedUnarchiver finishDecoding];
NSLog(@"person =====%@",newPerson.name);
//对Foundation框架中的对象进行归档和反归档
[self foundationClass]
//对自定义内容进行归档和反归档
[self customContent]
}
#pragma mark ------- 对Foundation框架中的对象进行归档和反归档 --------
- (void)foundationClass{
//归档(以数组为例说明)
//1. 创建路径
NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
//2. 拼接一个文件
NSString *filePath = [document stringByAppendingString:@"/file.plist"];
//3. 创建归档对象
NSArray *array = @[@"C", @"OC", @"UI"];
//4. 归档
//archiveRootObject: 对基本数据类型数据进行归档的方法
BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:filePath];
if (result) {
NSLog(@"array归档成功:%@", filePath);
}
//5. 不需要结束
//反归档
//1. 创建对象用来接收
NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"解档结果 = %@", newArray);
}
#pragma mark ------- 对自定义内容进行归档和反归档 --------
- (void)customContent{
//归档
//1. 获取路径
NSString *custonPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
custonPath = [custonPath stringByAppendingString:@"/customFile"];
//2. 使用Data对象存放归档数据
NSMutableData *data = [NSMutableData data];
//3. 创建归档对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//4. 对自定义内容进行归档
[archiver encodeObject:@"尼古拉斯.赵四" forKey:@"name"];
[archiver encodeObject:@"男" forKey:@"gender"];
[archiver encodeInt:22 forKey:@"age"];
[archiver encodeObject:@[@"AAAA", @"BBBB", @"CCCC"] forKey:@"array"];
//5. 完成归档
[archiver finishEncoding];
//6. 写入本地
BOOL result = [data writeToFile:custonPath atomically:YES];
if (result) {
NSLog(@"写入成功: %@", custonPath);
}
#warning <#message#>
//反归档:
//1. 读取文件, 转化成NSData对象类型
NSData *unarchiverData = [NSData dataWithContentsOfFile:custonPath];
//2. 创建反归档对象
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
//3. 反归档(根据KEY值访问)
NSString *str = [unArchiver decodeObjectForKey:@"name"];
NSLog(@"%@", str);
}
@end```