用NSKeyedArchiver存储数据(归档)
Posted jianze
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用NSKeyedArchiver存储数据(归档)相关的知识,希望对你有一定的参考价值。
一、NSKeyedArchiver和NSUserDefault的区别
NSUserDefault只能存储基本数据类型,如NSInteger NSString NSArray 但像UIImage就存不进去
将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。
二、用法
所存储的对象必须必须服从NSSecureCoding协议
1、对于已经服从的类型,如NSString、NSInteger可以直接使用
NSKeyedArchiver-归档
//1.对需要保存的数据进行编码 ->NSdata *
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@"ios" requiringSecureCoding:YES error:nil];
//2.将二进制数据保存到文件
//创建文件
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"];
//创建文件
[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
[data writeToFile:path atomically:YES];
NSKeyedUnarchiver-解归档
//解归档
//获取文件路径
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"];
//读取文件的内容
NSData *data = [NSData dataWithContentsOfFile:path];
//将二进制数据转化为对应的对象类型
NSString *str = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSString class] fromData:data error:nil];
NSLog(@"%@", str);
2.对于其他类型,如自己创建的模型,需要服从协议,并且实现某些方法
Person.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject<NSSecureCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
NS_ASSUME_NONNULL_END
Person.m实现一些方法
#import "Person.h"
@implementation Person
+ (BOOL)supportsSecureCoding{
return YES;
}
//归档的时候调用
//告诉编码器该如何归档
//将这个对象哪些属性编码起来
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
//解归档
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if ([super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
使用
ViewController.m 归档
//创建Person对象
Person *jz = [Person new];
jz.name = @"jz";
jz.age = 12;
//1.对需要保存的数据进行编码 ->NSdata *
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:jz requiringSecureCoding:YES error:nil];
//2.将二进制数据保存到文件
//创建文件
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"];
//创建文件
[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];
[data writeToFile:path atomically:YES];
解归档
//解归档
//获取文件路径
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"];
//读取文件的内容
NSData *data = [NSData dataWithContentsOfFile:path];
//将二进制数据转化为对应的对象类型
Person *jz = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:data error:nil];
NSLog(@"%@", jz);
以上是关于用NSKeyedArchiver存储数据(归档)的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发 - 数据归档与恢复 NSKeyedArchiver