ios 归档与解档

将对象进行归档或者解档时,需要遵循NSCoding协议,对象必须实现encodeWithCoder方法和initWithcoder方法用于对象的编码和解码。遵循NSCoding的协议可以被序列化和反序列化

一、 在需要归档的类中遵循归档协议(NSCoding)
@interface Program : NSObject<NSCoding>
//需要归档的属性
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
二、在归档对象的.m方法中实现NSCoding的协议方法
//方法一:普通方式实现
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    //告诉系统归档的属性是哪些
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        //解档
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
    }
    return self;
}
//方法二:使用runtime方式实现
...之后补充
三、在Controller中实现具体的存取操作
- (IBAction)save:(UIButton *)sender {
    Person *person = [[Person alloc] init];
    person.name = @"Frank";
    person.age = 18;
    
    //这里以temp路径为例,存到temp路径下
    NSString *temp = NSTemporaryDirectory();
    NSString *filePath = [temp stringByAppendingPathComponent:@"obj.data"]; //注:保存文件的扩展名可以任意取,不影响。
    NSLog(@"%@", filePath);
    //归档
    [NSKeyedArchiver archiveRootObject:person toFile:filePath];
}

- (IBAction)read:(UIButton *)sender {
    //取出归档的文件再解档
    NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"obj.data"];
    //解档
    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"name = %@, age = %ld",person.name,person.age);
}

优点:可以创建自己想要的数据模型,然后统一以模型方式存储。比属性列表过分依赖key要省心

缺点:归档的形式保存数据,只能一次性归档保存和一次性解压,只能针对少量数据,并且对数据处理比较笨拙。即如果想要改动数据的一小部分,还需要解压整个数据或者归档整个数据,没有属性列表速度快(NSUserDefault)https://www.jianshu.com/p/d24dd98bc9dc
,因为他每次都要把数据保存到闪存中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • /*iOS归档小结:1.归档实际上就是一种文件保存的形式,几乎所有的对象都能够被归档存储。它使用NSKeyedAr...
    彬至睢阳阅读 934评论 0 0
  • 关键词: 归档:数据持久化的一种方式,是将数据进行编码序列化之后存储的过程。适用于小量数据的存储。 解档:对归档的...
    追沐阅读 1,562评论 0 1
  • 一、归档的基本概念 之前将数据保存本地,只能是字符串、数组、字典、NSNuber、BOOL等容器类对象对象,不能将...
    空白Null阅读 5,247评论 1 10
  • 作者si1ence2016.05.20 10:24* http://www.jianshu.com/p/bc3f8...
    Kiddz阅读 1,235评论 0 12
  • 数据持久化的相关知识 四种将数据持久化存储到iOS文件系统的机制: plist 对象归档 iOS的嵌入式关系数据库...
    melouverrr阅读 651评论 0 0