zoukankan      html  css  js  c++  java
  • 归档(上)

    归档

    1> 概念:对象归档是一个过程,即某种格式来保存一个或多个对象,以便以后还原这些对象

    在其它语言中,对象归档也叫对象序列化

    2> 要对自定义的对象(而不是Foundation里默认的对象)进行归档的话就需要引入归档协议<NSCoding>

    实现两个方法

    -(void) encodeWithCoder: (NSCoder *) aCoder

    -(id) initWithCoder: (NSCoder *) aDecoder

    3> 对象归档方法

    [NSKeyedArchiver  archiveRootObject: user1 toFile: filePath];

    对象解归档方法

    [NSKeyedUnarchiver  unarchiveObjectWithFile: filePath];

    帮助大家深入理解:

    归档过程: 它在后台创建一个NSKeyedArchiver实例,然后,它将NSKeyedArchiver实例传递给对象thing的-encodeWithCoder:方法。当thing编码自身的属性时,它可能对其他对象也进行编码,例如字符串,数组以及我们可能输入到该数组中的任何内容。整个对象集合完成键和值的编码后,具有键/值对的归档程序将所有对象扁平化为一个NSData类并将其返回.方法中的主要的参数就是NSCoder,它是archivie字节流的抽象类.可以将数据写入一个coder,也可以从coder中读取我们写入的数据. NSCoder是一个抽象类,不能直接使用它来创建对象. 但是可以通过其子类NSKeyedUnarchiver从字节流中读取数据,NSKeyedArchiver将对象写入到字节流

    用个例子来解释一下 person类 

    #import <Foundation/Foundation.h>

    @interface Person : NSObject<NSCoding>

    @property (nonatomic, copy) NSString * name;

    @property (nonatomic, assign) int age;

    @property (nonatomic, assign) double weight;

    @end

    #import "Person.h"

    @implementation Person

    //NSCoder抽象类

    //归档

    - (void)encodeWithCoder:(NSCoder *)aCoder {

        

        [aCoder encodeObject:self.name forKey:@"name"];

        [aCoder encodeInt:self.age forKey:@"age"];

        [aCoder encodeDouble:self.weight forKey:@"weight"];

        

    }

    //解档

    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {

        

        if (self = [super init]) {

            

            self.name = [aDecoder decodeObjectForKey:@"name"];

            self.age = [aDecoder decodeIntForKey:@"age"];

            self.weight = [aDecoder decodeDoubleForKey:@"weight"];

        }

        

        return self;

    }

    @end

    主函数:

    #import <Foundation/Foundation.h>

    #import "Person.h"

    void test()

    {

        Person * p = [[Person alloc] init];

        p.name = @"dahuan";

        p.age = 18;

        p.weight = 100.0;

        

        BOOL isSuccess = [NSKeyedArchiver archiveRootObject:p toFile:@"/Users/dahuan/Desktop/test.txt"];

        if (isSuccess) {

            NSLog(@"归档成功");

        } else {

            NSLog(@"归档失败");

        }

    }

    int main(int argc, const char * argv[]) {

        @autoreleasepool {

            //解档

            Person * p = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/dahuan/Desktop/test.txt"];

            NSLog(@"%@",p.name);

            NSLog(@"%d",p.age);

            NSLog(@"%f",p.weight);

            

            

        }

        return 0;

    }

  • 相关阅读:
    【iCore3 双核心板】例程九:ADC实验——电源监控
    【iCore3 双核心板】例程八:定时器PWM实验——呼吸灯
    【iCore3双核心板】扩展引脚分布
    【iCore3 双核心板】例程七:WWDG看门狗实验——复位ARM
    【iCore3 双核心板】例程六:IWDG看门狗实验——复位ARM
    【iCore3 双核心板】例程五:SYSTICK定时器实验——定时点亮LED
    【iCore3 双核心板】例程四:USART通信实验——通过命令控制LED
    【iCore3 双核心板】例程三:EXTI中断输入实验——读取ARM按键状态
    【iCore3 双核心板】例程二:读取arm按键状态
    【iCore3 双核心板】例程一:ARM驱动三色LED
  • 原文地址:https://www.cnblogs.com/yangyongnian/p/5479349.html
Copyright © 2011-2022 走看看