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

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

内容简介:作者:雪山飞狐_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)方式总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Writing Windows VxDs and Device Drivers, Second Edition

Writing Windows VxDs and Device Drivers, Second Edition

Karen Hazzah / CMP / 1996-01-12 / USD 54.95

Software developer and author Karen Hazzah expands her original treatise on device drivers in the second edition of "Writing Windows VxDs and Device Drivers." The book and companion disk include the a......一起来看看 《Writing Windows VxDs and Device Drivers, Second Edition》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具