浅析iOS中的归档与反归档

今天我们要搞一搞iOS开发当中的归档和反归档,在进入正题之前,我们需要了解一下归档和反归档是干什么用的。

所谓归档,最通用的定义就是存储有组织的数据,目的是为了长时间存放有组织的数据集。实际上就是将对象写入文件当中。下面我们学习第一种归档与反归档方法

一、
(1)归档

    NSArray *array = [NSArray arrayWithObjects:@1,@2,@3, nil];
    
    NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"testFile.plist"];
    
    BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:filePath];
    
    NSLog(@"%d",success);
    NSLog(@"%@",filePath);

通过打印BOOL值来判断是否归档成功,也可以打印文件路径,通过Finder查找到文件夹来查看归档结果。

归档结果.png

(2)反归档

NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"testFile.plist"];
    
    id array = [NSKeyedUnarchiver unarchiveObjectWithFile:filepath];
    
    NSLog(@"%@",array);

第一种方法比较简单,但是只能存储单个对象。
第二种方法可以将多个对象归档成一个文件。

二、

(1)归档

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"BigDragon",@"BigBiao",@"BigBaby", nil];
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //编码
    [archiver encodeObject:array forKey:@"array"];
    [archiver encodeObject:@"Jason‘s friends" forKey:@"name"];
    
    //编码完成之后,对象已经存储到data之中。
    [archiver finishEncoding];
    
    NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.plist"];
    BOOL success = [data writeToFile:filePath atomically:YES];
    NSLog(@"%d",success);```

*(2)反归档*

NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.plist"];
//读取归档数据
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];

//创建解归档对象,进行反归档
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

//反归档
NSArray *array = [unarchiver decodeObjectForKey:@"array"];
NSLog(@"%@",array);

NSString *name = [unarchiver decodeObjectForKey:@"name"];
NSLog(@"%@",name);```

前两种方法我们归档的都是系统给定的类,那么如何归档我们自定义的类呢?

(三)归档自定义对象

美好的一天从创建一个Person类开始。 ——洋哥

遵从洋哥的教诲,让我们先创建一个Person类吧。

自定义类的归档需要遵守NSCoding协议,废话不多说,还是看代码吧。

Person.h

#import <Foundation/Foundation.h>

// 给自定义类归档,首先要遵守NSCoding协议。
@interface Person : NSObject<NSCoding>

@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,strong) NSString *gender;

- (NSString *)description;

@end```

*Person.m*
*.m文件中需要写encodeWithCoder和initWithCoder两个方法,分别在归档和反归档的时候调用。*

import "Person.h"

@implementation Person

// 归档方法

  • (void)encodeWithCoder:(NSCoder *)aCoder
    {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    }
    // 反归档方法

  • (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
    self = [super init];

    if (self != nil) {
    self.name = [aDecoder decodeObjectForKey:@"name"];
    self.age = [aDecoder decodeIntegerForKey:@"age"];
    self.gender = [aDecoder decodeObjectForKey:@"gender"];
    }
    return self;
    }

  • (NSString *)description
    {
    NSString *string = [NSString stringWithFormat:@"%@,%ld,%@",self.name,self.age,self.gender];
    return string;
    }
    @end```

main函数
写完Person的.h 和 .m 文件之后,接下来的就是在main函数中的操作了,我这里用的是ViewController,效果是一样的。

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    Person *person = [[Person alloc]init];
    
    person.name = @"BigBaby";
    person.age = 16;
    person.gender = @"男";
    
    // 归档,调用归档方法
    NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"person.plist"];
    BOOL success = [NSKeyedArchiver archiveRootObject:person toFile:filePath];
    NSLog(@"%d",success);
    
    // 反归档,调用反归档方法
    Person *per = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@",per);
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}```
*通过打印反归档解出来的BOOL值和对象per,可以验证是否归档和反归档成功。*
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,684评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,280评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,311评论 6 13
  • 第一步:降级CFE 如果固件版本是246、260的,需要先用 K3降级CFE助手 降级CFE,如果是217版本,可...
    熊孩子2017阅读 4,941评论 0 50
  • 文/董改正 不久前,各种媒体突现“香菇蓝瘦”一词,深令我等资讯滞后者惶惑,问讯度娘后才知道原来是一个广西小伙子被分...
    桃花岛上的桃花源阅读 564评论 0 0