• 归档、反归档


    什么是归档? 反归档?

    把 OC 中基本数据存储到沙盒中,被称为基本数据持久化。 基本数据,在 oc中有以下四种,分别为 NSString 、 NSArray 、 NSDictionary 、 NSData。字符串、 数组、 字典 和 数据 这四种类型,系统提供了 writeToFile: 直接写入文件的方法, 因此可以直接存储数据到沙盒中。而对于 OC 中非基本数据类型,比如: UIImage 、 自定义类型Person 等,系统并没有提供 直接写入文件的方法。 这就需要我们把 非基本数据类型 转化为 NSData ,然后再存入到沙盒中。 把 复杂类型 通过 编码方式 转化为 data 型数据的过程称为,归档。 把 已编码的data 型数据, 通过解码方式转化为 原有复杂类型 的过程称为,反归档。

    - (void)guidang

    {

        /**

         归档(序列化):将遵守了NSCoding协议的对象转换成 NSData的过程

         反归档(反序列化):将归档后的NSData数据转换回对象的过程

         归档的流程:

         step1:准备一个NSMutableData

         step2:创建NSKeyedArchiver

         step3:使用归档器  执行 encode编码

         step4:归档器 finishEncode

         */

        NSArray *arr = @[@"张三",@"李四",@"王五"];

        

        User * user = [[User alloc]init];

        

        user.name = @"我的";

        

        user.age  = @"20";

        

        user.phone = @"13423";

        /**

         *  @brief 先准备一块空白的可变data空间

         */

        NSMutableData * data = [NSMutableData data];

        /**

         *  @brief 创建归档对象时,指明归完档后的data要存在哪里

         */

        NSKeyedArchiver * arch = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

        

        [arch encodeObject:user forKey:@"user"];

        

        [arch encodeObject:arr forKey:@"arr"];

        /**

         *  @brief 注意:归档时一定要写以下这句才能真的归档

         */

        [arch finishEncoding];

        /**

         *  @brief 将归档完的data存到文件中

         */

        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    

        NSString *filePath = [NSString stringWithFormat:@"%@/test",[paths firstObject]];

        [data writeToFile:filePath atomically:YES];

    }

     

    - (void)fanguidang

    {

        /**

         step1:获取要反归档的NSData数据

         step2:创建NSKeyedUnarchiver对象

         step3:使用反归档器 执行decode解码

         */

        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        

        NSString *filePath = [NSString stringWithFormat:@"%@/test",[paths firstObject]];

        

        NSData * data = [NSData dataWithContentsOfFile:filePath];

        

        NSKeyedUnarchiver *unArch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

        User *user = [unArch decodeObjectForKey:@"user"];

        

        NSArray * arr = [unArch decodeObjectForKey:@"arr"];

        

        NSLog(@"%@",arr);

        

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

        

        NSLog(@"%@",user.age);

        

        NSLog(@"%@",user.phone);

    }

     

    要归档的对象:

    #import <Foundation/Foundation.h> 

    /**

     *  @brief 要进行归档,要服从协议

     */

    @interface User : NSObject <NSCoding>

    @property(nonatomic,copy)NSString * name;

    @property(nonatomic,copy)NSString * age;

    @property(nonatomic,copy)NSString * phone;

    /**

     *  @brief NSCoding协议声明了两个方法

     */

    /**

    - (void)encodeWithCoder:(NSCoder *)aCoder;  //将对象写入到文件中

     

    - (id)initWithCoder:(NSCoder *)aDecoder;    //将文件中的数据读入到对象中

     */

     @end

    #import "User.h"

    @implementation User

    /**

     *  @brief 当对一个对象进行归档时,自动调用该方法。

     */

    - (void)encodeWithCoder:(NSCoder *)aCoder

    {

        [aCoder encodeObject:_name forKey:@"name"];

        [aCoder encodeObject:_age forKey:@"age"];

        [aCoder encodeObject:_phone forKey:@"phone"];

    }

    /**

     *  @brief 当对一个对象进行反归档时,自动调用该方法。

     */

    - (id)initWithCoder:(NSCoder *)aDecoder

    {

        self = [super init];

        if (self) {   

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

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

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

        }

        return self;

    }

    @end

     

  • 相关阅读:
    腾讯开放平台 手机QQ登录 错误码:110406 解决办法
    比较酷的安卓软件
    Top 10 Methods for Java Arrays
    Feathers UI 性能优化
    Starling中通过PivotX 和 PivotY 修改原点
    Adobe AIR 中为不同尺寸和分辨率屏幕适配
    Feathers组件的宽度或高度属性,为什么我得到的值是0
    "Type Coercion failed" Error in FlashBuilder 4.7
    正则表达式中的特殊字符
    单体内置对象 Global 和 Math
  • 原文地址:https://www.cnblogs.com/shifenglin/p/5332905.html
Copyright © 2020-2023  润新知