归档、解档:说白了就是把对象保存在文件,和从文件中读取对象。
缺点:只能一次性归档保存,以及一次性解压。每次改动数据,都要解压整个数据,然后还要归档保存。倘若你当前归档时,文件有100个对象,此时想改动这个文件添加对象,那么必须要解档拿出这100个对象,然后再添加,然后再归档,这样处理性能很低。
苹果目前严格控制移动设备上的归档处理,不能有大量压缩的文件。
归档的类需要遵守NSCoding协议
//
// ViewController.m
// NSKeyedArchiver
//
// Created by HZhenF on 2017/5/31.
// Copyright © 2017年 Huangzhengfeng. All rights reserved.
//
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]);
Person *p = [[Person alloc] init];
p.name = @"HZhenF";
p.age = 21;
NSString *currentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [currentPath stringByAppendingPathComponent:@"person.data"];
//将对象归档
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
//将对象解档
Person *unarchiverPerson = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@",unarchiverPerson);
}
@end
//
// Person.h
// NSKeyedArchiver
//
// Created by HZhenF on 2017/5/31.
// Copyright © 2017年 Huangzhengfeng. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCoding>
@property(nonatomic,strong) NSString *name;
@property(nonatomic,assign) int age;
-(NSString *)description;
@end
//
// Person.m
// NSKeyedArchiver
//
// Created by HZhenF on 2017/5/31.
// Copyright © 2017年 Huangzhengfeng. All rights reserved.
//
#import "Person.h"
@implementation Person
-(NSString *)description
{
return [NSString stringWithFormat:@"name = %@----age = %d",self.name,self.age];
}
//归档
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInt:self.age forKey:@"age"];
}
//解档
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}
@end