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

查看所有标签

猜你喜欢:

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

Programming Concurrency on the JVM

Programming Concurrency on the JVM

Venkat Subramaniam / The Pragmatic Bookshelf / 2011-6-1 / USD 35.00

Concurrency on the Java platform has evolved, from the synchronization model of JDK to software transactional memory (STM) and actor-based concurrency. This book is the first to show you all these con......一起来看看 《Programming Concurrency on the JVM》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具