归档/解档

一、对系统类进行归档/解档

第一种:对集合类对象进行归档/解档

归档:

 NSArray *arr = @[@"one", @1, @"two", @{@"one":@"hello"}, @[@1, @2]];
        BOOL ret = [NSKeyedArchiver archiveRootObject:arr toFile:@"文件路径/arr.archive"];
        if (ret) {
            NSLog(@"归档成功");
        }else{
            NSLog(@"归档失败");
        }

解档

方法(1)

NSArray *arr1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"文件路径/arr.archive"];
        NSLog(@"%@", arr1);

方法(2)

  NSData *data = [[NSData alloc] initWithContentsOfFile:@"文件路径/arr.archive"];
        NSArray *arr2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        NSLog(@"%@", arr2);

第二种:非集合类进行归档/解档

    NSString *name = @"hello";
    NSInteger age = 10;

归档:

        //创建一个空的二进制数据对象
        NSMutableData *mData = [NSMutableData data];
        
        //创建归档对象
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
        
        //将数据写入归档的对象
        //注意:不同的数据类型用不同的方法
        [archiver encodeObject:name forKey:@"Name"];
        [archiver encodeInteger:age forKey:@"Age"];
        //结束归档
        [archiver finishEncoding];
        
        //生成归档文件
        [mData writeToFile:@"文件路径/test.archive" atomically:YES];
        ```
####解档:       
    NSData *data = [NSData dataWithContentsOfFile:@"文件路径/test.archive"];
    //创建解档对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    
    //根据key值解档数据,key值必须要和上面自己设定的key一样
    NSString *str = [unarchiver decodeObjectForKey:@"Name"];
    NSInteger age1 = [unarchiver decodeIntegerForKey:@"Age"];
    //结束解档
    [unarchiver finishDecoding];
    
    NSLog(@"%@ %ld", str, age1);
#二、对自定义的类进行归档/解档
####Car.h文件

import

import "Engine.h"

//自定义类归档,需要遵守NSCoding协议,并实现协议中方法
@interface Car : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger speed;
//如果自定义类里有其他自定义类的属性,该作为属性的自定义类页必须遵守NSCoding协议,并且实现其中的方法
@property (nonatomic, retain) Engine *engine;

@end

####Car.m文件

import "Car.h"

@implementation Car

  • (void)dealloc
    {
    self.name = nil;
    self.engine = nil;
    [super dealloc];
    }

//归档的时候自动调用encodeWithCoder
//自定义类归档,就是针对类中的成员变量分别归档
//如果自定类中包含其他自定义类,其他自定义类也要遵守NSCoding协议

  • (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"CarName"];
    [aCoder encodeObject:self.engine forKey:@"Engine"];
    [aCoder encodeInteger:self.speed forKey:@"Speed"];
    }

//解档的时候自动调用initWithCoder

  • (instancetype)initWithCoder:(NSCoder *)aDecoder{
    //如果存在继承关系,且父类遵守NSCoding协议,并实现协议中的方法,子类中实现initWithCoder方法时,需要写成self = [super initWithCoder:aDecoder]
    if (self = [super init]) {
    self.name = [aDecoder decodeObjectForKey:@"CarName"];
    // self.engine = [aDecoder decodeObjectForKey:@"Engine"];
    //与上面写法等价
    _engine = [[aDecoder decodeObjectForKey:@"Engine"] retain];
    self.speed = [aDecoder decodeIntegerForKey:@"Speed"];
    }
    return self;
    }

@end

####Engine.h

import

@interface Engine : NSObject

@property (nonatomic, copy) NSString *name;

@end

####Engine.m

import "Engine.h"

@implementation Engine

  • (void)dealloc
    {
    self.name = nil;
    [super dealloc];
    }

  • (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"EngineName"];
    }

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

@end














































































你可能感兴趣的:(归档/解档)