一、简单的一个数据的归档
先定义全局变量的路径
@interface ViewController () { NSString *path; } @end
1、找到路径 并且在该路径下创建归档文件
path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; path = [path stringByAppendingPathComponent:@"data.arichiver"];
2、开始归档
// 对单个的数据进行归档 [self arichiverWithName:@"小明" Age:@(25)]; //归档的方法 - (void)arichiverWithName:(NSString *)name Age:(NSNumber *)age{ [NSKeyedArchiver archiveRootObject:name toFile:path]; [NSKeyedArchiver archiveRootObject:age toFile:path]; }
3、解归档
// 解归档 [self unarichiver]; //解归档的方法 - (void)unarichiver{ NSString *string = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"%@",string); }
注意:输出结果 只有最后归档的那个数据 原因是被覆盖了 (解决办法 可以把名字和年龄放在一个字典里 把字典归档 再解归档即可)
二、把多个数据进行归档
1、找路径 在这里还用上面的路径 也可以重新定义路径
path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; path = [path stringByAppendingPathComponent:@"data.arichiver"];
2、初始化一个可变的二进制对象 目的是把二进制对象写入到文件 并且 准备要归档的数据
NSMutableData *data = [NSMutableData data]; NSString *name = @"小明"; NSNumber *age = @(26); NSString *sex = @"男";
3、归档等待写入数据的二进制对象 (要使用归档的对象 对需要归档的数据 进行编码)
NSKeyedArchiver *arichiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
4、使用归档对象,对要归档的数据进行编码(编码结束后同时写入到二进制对象)
[arichiver encodeObject:name forKey:@"name"]; [arichiver encodeObject:age forKey:@"age"]; [arichiver encodeObject:sex forKey:@"sex"];
5、编码结束(系统把编码后的数据 写入到二进制文件)《现在二进制对象里面 已经存在 编码之后的 数据 》
[arichiver finishEncoding];
6、把二进制对象 存储到指定位置 归档成功 注意参数atomically:YES 指原子性 如果设置为YES表示 会写入完整的数据 比如说:被中途电话打断的部分数据不会归档 设置为NO会存入不完整的数据
[data writeToFile:path atomically:YES];
开始解归档
1、先找到路径 这里在同一个类 路径不用重新查找
2、将归档里的二进制数据取出来 用data读取数据 重点语句 起到桥梁联系的作用
NSMutableData *readData = [NSMutableData dataWithContentsOfFile:path]; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:readData];
3、用数据相应的数据类型 接收解归档的数据
NSString *names = [unarchiver decodeObjectForKey:@"name"]; NSNumber *ages = [unarchiver decodeObjectForKey:@"age"]; NSString *sexs = [unarchiver decodeObjectForKey:@"sex"]; NSLog(@"%@ %@ %@",names,ages,sexs);//输出验证
三、系统的归档方法 现在以一个类进行说明
新建一个类 名字为Person
Person.h文件 三个属性 遵守一个协议
@interface Person : NSObject<NSCoding> @property (nonatomic,copy) NSString *name; @property (nonatomic,assign) NSInteger age; @property (nonatomic,copy) NSString *sex; @end
Person.m文件
//归档的时候调用的方法 - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInteger:self.age forKey:@"age"]; [aCoder encodeObject:self.sex forKey:@"sex"]; } //解归档时调用的方法 - (instancetype)initWithCoder:(NSCoder *)aDecoder{ self = [super init]; if (self) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntegerForKey:@"age"]; self.sex = [aDecoder decodeObjectForKey:@"sex"]; } return self; }
1、定义Person对象 并给属性赋值
Person *person = [[Person alloc]init]; person.name = @"小月"; person.age = 20; person.sex = @"女";
2、 要把对象归档的路径
NSString *paths = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
3、在路径下写入归档文件
paths = [paths stringByAppendingPathComponent:@"person.archiver"];
4、把对象进行归档
[NSKeyedArchiver archiveRootObject:person toFile:paths];
5、用相同类的对象进行接收 并输出验证
Person *getPerson = [NSKeyedUnarchiver unarchiveObjectWithFile:paths]; // 输出验证 NSLog(@"%@ %ld %@",getPerson.name,getPerson.age,getPerson.sex);