iOS中三种归档(NSKeyArchieve)方式总结

栏目: IOS · 发布时间: 5年前

内容简介:作者:雪山飞狐_91ae链接:https://www.jianshu.com/p/680e0ebb6253来源:简书

归档时iOS中一种常见的存储文件的方式。在iOS中,归档可以将一切对象,包括自定义的对象都存储在文件中,其中常见的三种归档方式为简单归档,NSData归档,自定义归档。

  • 简单归档

简单归档就是把常见的字符串,字典,数组等不经过转化直接写入文件。我们先创建一个沙盒中的路径,这个路径就是我们将要存放字符串,字典,数组等的地方。然后我们再利用NSKeyArchieve的类方法 archiveRootObject: toFile: 将字符串或数组写入到我们创建的路径的文件中。 archiveRootObject: toFile: 这个方法会自动创建文件。下面是具体的步骤:

NSArray *array = @[@1, @2, @3];//创建一个沙盒地址NSString *path = [NSString stringWithFormat:@"%@/documents/arrayFile", NSHomeDirectory()];//这句话会自动创建path对应的文件,并将array写入到该文件中去,完成归档[NSKeyedArchiver archiveRootObject:array toFile:path];//根据文件地址实现解档NSArray *array1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
  • NSData归档

这种归档方式是先创建一个可变的data对象,然后根据这个对象来创建一个NSKeyArchieve的实例对象,然后利用这个实例对象对多个基本数据类型进行归档,之后再写入一个指定的沙盒路径。 这个方式的好处是我们可以写入多个基本数据类型到同一个文件 。下面是具体的实现步骤:

//创建存放路径
    NSString *dataPath = [NSString stringWithFormat:@"%@/documents/dataFile", NSHomeDirectory()];    //创建可变的data
    NSMutableData *mutableData = [[NSMutableData alloc] init];    //通过data创建NSKeyedArchiver的实例对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mutableData];    
    //进行归档
    [archiver encodeObject:@"string" forKey:@"string"];
    [archiver encodeBool:YES forKey:@"sex"];
    [archiver encodeInt:5 forKey:@"age"];
    [archiver finishEncoding];    //写入文件
    [mutableData writeToFile:dataPath atomically:YES];    
    //解归档
    NSData *dataout = [NSData dataWithContentsOfFile:dataPath];    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:dataout];    NSString *string = [unarchiver decodeObjectForKey:@"string"];    BOOL sex = [unarchiver decodeBoolForKey:@"sex"];    int age = [unarchiver decodeIntForKey:@"age"];
  • 自定义归档

在第一个例子中如果array中的内容不是NSNumber类型的数据,而是自定义的对象呢?还能成功的归档吗?答案是否定的。比如说我们有一个Person类,它有两个属性,name和age,array中存放的即两个Person类的实例。 为了实现转码成功,在Person类中要实现NSCoding协议,在归档的过程中转码,才能归档成功

NSCoding协议有两个方法,且都是require。自定义的类中实现了这两个方法才能对自定义的对象进行归档。这两个方法是:

//对自定义的类内部的属性变量进行转码-(void)encodeWithCoder:(NSCoder *)aCoder;//对自定义的类中的属性变量根据关键字进行逆转码-(id)initWithCoder:(NSCoder *)aDecoder;

下面就看一下具体的实现:

//Person.h@interface Person : NSObject 
<nscoding>
 @property (nonatomic, strong)NSString *name;@property (nonatomic, assign)int age;

- (instancetype)initWithName:(NSString *)name age:(int)age;//Person.m#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name age:(int)age{    
    self = [super init];    
    if(self){
        
        _name = name;
        _age = age;
    }    
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder{
    
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeInt:_age forKey:@"age"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{    
    self = [super init];    if(self){
        
        _name = [aDecoder decodeObjectForKey:@"name"];
        _age = [aDecoder decodeIntForKey:@"age"];
    }    
    return self;
}@end
</nscoding>
    Person *person1 = [[Person alloc] initWithName:@"小花" age:8];
    Person *person2 = [[Person alloc] initWithName:@"小明" age:9];    
    NSArray *array =  @[person1, person2];    
    NSString *path = [NSString stringWithFormat:@"%@/documents/custom", NSHomeDirectory()];
    [NSKeyedArchiver archiveRootObject:array toFile:path];    
    NSArray *array1 = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

作者:雪山飞狐_91ae

链接:https://www.jianshu.com/p/680e0ebb6253

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


以上所述就是小编给大家介绍的《iOS中三种归档(NSKeyArchieve)方式总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Out of Control

Out of Control

Kevin Kelly / Basic Books / 1995-4-14 / USD 22.95

Out of Control is a summary of what we know about self-sustaining systems, both living ones such as a tropical wetland, or an artificial one, such as a computer simulation of our planet. The last chap......一起来看看 《Out of Control》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具