用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

iOS数据持久化存储之归档NSKeyedArchiver

IOS数据持久化之归档NSKeyedArchiver

nskeyedarchiver 可以存到数据库吗

iOSiOS数据存储,应用沙盒,XML,Preference,NSKeyedArchiver归档,SQLite3

iOS本地存储1--NSkeyedArchiever归档