码迷,mamicode.com
首页 > 其他好文 > 详细

用NSKeyedArchiver存储数据(归档)

时间:2019-04-27 17:03:17      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:mil   nsobject   EDA   obj   属性   cal   suse   区别   用法   

一、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存储数据(归档)

标签:mil   nsobject   EDA   obj   属性   cal   suse   区别   用法   

原文地址:https://www.cnblogs.com/jianze/p/10778821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!