用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);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM