iOS新手学习iOS TipsiOS开发的那些事儿。。。

浅析iOS中的归档与反归档

2016-02-20  本文已影响3938人  老实的大宝

今天我们要搞一搞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

// 归档方法

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,可以验证是否归档和反归档成功。*
上一篇下一篇

猜你喜欢

热点阅读