一、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);