缓存之归档、反归档

  • 归档反归档是数据存储方式的一种。归档将复杂数据结构转换成NSData进行存储,反归档将NSData转成复杂数据结构。
存储自定义类型,需要先服从“<NSCoding>”协议,然后实现两个方法:
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (instancetype)initWithCoder:(NSCoder *)aDecoder;
⚠️:如果有一个(类A)继承(Model),那么(类A)也需要实现这两个方法。
⚠️:在真机上测试的时候,一要给plist文件写一个明确的地址,不能只给个沙盒文件路径。


----------------------------------Model.h-----------------------------------
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Model : NSObject<NSCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) UIImage *image;

- (NSString *)description;
@end

---------------------------------------Model.m-----------------------------
#import "Model.h"

@implementation Model

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
    [aCoder encodeObject:UIImagePNGRepresentation(self.image) forKey:@"image"];
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    
    if (self) {
        self.name = [aDecoder decodeObjectForKey:@"name"];;
        self.age = [aDecoder decodeIntegerForKey:@"age"];
        self.image = [aDecoder decodeObjectForKey:@"image"];
    }
    
    return self;
}

- (NSString *)description
{
    NSString *string = [NSString stringWithFormat:@"%@,%ld,%@",self.name,(long)self.age, self.image];
    return string;
}
  • 实现归档反归档:
  • 生成modle,放入数组.
Model *modelPanda = [[Model alloc] init];
modelPanda.name = @"panda";
modelPanda.age = 18;
modelPanda.image = [UIImage imageNamed:@"123.jpg"];

Model *modelLuce = [[Model alloc] init];
modelLuce.name = @"Luce";
modelLuce.age = 20;
modelLuce.image = [UIImage imageNamed:@"123.jpg"];

NSMutableArray *arr = [@[modelLuce, modelPanda] mutableCopy];
  • NSData的归档与返归档
//真机时候,要将@"path.plist" -> @"Documents/pers.plist";
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"path.plist"];

NSMutableData *mulData = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mulData];
[archiver encodeObject:arr forKey:@"arr"];
[archiver finishEncoding];

BOOL success = [mulData writeToFile:path atomically:YES];
NSLog(@"%d", success);

//反归档
NSData *data = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

id arrUN = [unarchiver decodeObjectForKey:@"arr"];
NSLog(@"%@", arrUN);

  • Object的归档与返归档
//归档
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"person.plist"];
BOOL success = [NSKeyedArchiver archiveRootObject:modelLuce toFile:filePath];
NSLog(@"success : %d", success);

//反归档
Model *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@", person);
   
  • 🐷
当属性较多时可以利用runtime进行归档反归档。
待实现...
参考:http://blog.csdn.net/xuejunrong/article/details/51771158
     http://stackoverflow.com/questions/963175/nskeyedarchiver-works-in-iphone-simulator-fails-on-device
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,217评论 30 472
  • iOS 開発の結構 画面 UI UIWebview [[UIApplication sharedApplicati...
    RencaiXiong阅读 606评论 0 0
  • 1.1 谈一谈GCD和NSOperation的区别? 首先二者都是多线程相关的概念,当然在使用中也是根据不同情境进...
    John_LS阅读 1,343评论 0 12
  • 以上原始手动解档归档代码下载地址如下 runtime实现归档解档代码下载地址如下可以直接拉入项目使用 为什么我们要...
    雷鸣1010阅读 446评论 0 2
  • 文/雍万萍 爱来的时候 似一团烈焰 将彷徨的心儿烧焦 爱走的时候 如一堆灰烬 将孤独的魂灵击倒 叹息 泪水 心如刀...
    频彩阅读 240评论 2 6