• 归档 解归档


    一、简单的一个数据的归档

    先定义全局变量的路径

    @interface ViewController ()
    {
        NSString *path;
    }
    @end

    1、找到路径 并且在该路径下创建归档文件

     path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    path
    = [path stringByAppendingPathComponent:@"data.arichiver"];

    2、开始归档 

    //    对单个的数据进行归档
        [self arichiverWithName:@"小明" Age:@(25)];
    
    
    //归档的方法
    - (void)arichiverWithName:(NSString *)name Age:(NSNumber *)age{
        
        [NSKeyedArchiver archiveRootObject:name toFile:path];
        [NSKeyedArchiver archiveRootObject:age toFile:path];
        
    }

    3、解归档

    //    解归档 
        [self unarichiver];
    
    //解归档的方法
    
    - (void)unarichiver{ 
       NSString *string = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        NSLog(@"%@",string);
    }

    注意:输出结果  只有最后归档的那个数据 原因是被覆盖了  (解决办法  可以把名字和年龄放在一个字典里  把字典归档  再解归档即可)

    二、把多个数据进行归档

    1、找路径  在这里还用上面的路径  也可以重新定义路径

    path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
     path = [path stringByAppendingPathComponent:@"data.arichiver"];

    2、初始化一个可变的二进制对象 目的是把二进制对象写入到文件  并且 准备要归档的数据

        NSMutableData *data = [NSMutableData data];
        NSString *name = @"小明";
        NSNumber *age = @(26);
        NSString *sex = @"";

    3、归档等待写入数据的二进制对象 (要使用归档的对象  对需要归档的数据 进行编码)

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

    4、使用归档对象,对要归档的数据进行编码(编码结束后同时写入到二进制对象)

        [arichiver encodeObject:name forKey:@"name"];
        [arichiver encodeObject:age forKey:@"age"];
        [arichiver encodeObject:sex forKey:@"sex"];

    5、编码结束(系统把编码后的数据 写入到二进制文件)《现在二进制对象里面 已经存在 编码之后的 数据 》

    [arichiver finishEncoding];

    6、把二进制对象 存储到指定位置 归档成功  注意参数atomically:YES  指原子性 如果设置为YES表示 会写入完整的数据 比如说:被中途电话打断的部分数据不会归档 设置为NO会存入不完整的数据

    [data writeToFile:path atomically:YES];

    开始解归档

    1、先找到路径  这里在同一个类  路径不用重新查找

    2、将归档里的二进制数据取出来 用data读取数据  重点语句  起到桥梁联系的作用

       NSMutableData *readData = [NSMutableData dataWithContentsOfFile:path];
        
       NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:readData];

    3、用数据相应的数据类型  接收解归档的数据

        NSString *names = [unarchiver decodeObjectForKey:@"name"];
        NSNumber *ages = [unarchiver decodeObjectForKey:@"age"];
        NSString *sexs = [unarchiver decodeObjectForKey:@"sex"];
     NSLog(@"%@ %@ %@",names,ages,sexs);//输出验证

    三、系统的归档方法  现在以一个类进行说明

    新建一个类 名字为Person

    Person.h文件 三个属性  遵守一个协议

    @interface Person : NSObject<NSCoding>
    
    
    @property (nonatomic,copy) NSString *name;
    @property (nonatomic,assign) NSInteger age;
    @property (nonatomic,copy) NSString *sex;
    
    
    
    @end

    Person.m文件

    //归档的时候调用的方法
    - (void)encodeWithCoder:(NSCoder *)aCoder{
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeInteger:self.age forKey:@"age"];
        [aCoder encodeObject:self.sex forKey:@"sex"];
    }
    
    //解归档时调用的方法
    - (instancetype)initWithCoder:(NSCoder *)aDecoder{
        self = [super init];
        if (self) {
            
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeIntegerForKey:@"age"];
            self.sex = [aDecoder decodeObjectForKey:@"sex"];
        }
        return self;
    }

    1、定义Person对象  并给属性赋值

       Person *person = [[Person alloc]init];
        person.name = @"小月";
        person.age = 20;
        person.sex = @"";

    2、 要把对象归档的路径

    NSString *paths = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

    3、在路径下写入归档文件

     paths = [paths stringByAppendingPathComponent:@"person.archiver"];

    4、把对象进行归档

    [NSKeyedArchiver archiveRootObject:person toFile:paths];

    5、用相同类的对象进行接收  并输出验证

     Person *getPerson = [NSKeyedUnarchiver unarchiveObjectWithFile:paths];
    //    输出验证
        NSLog(@"%@ %ld %@",getPerson.name,getPerson.age,getPerson.sex);
  • 相关阅读:
    CentOS设置密码复杂度及过期时间等
    CentOS开启telnet连接
    Centos6.5升级openssh至7.4版本
    Centos7搭建SVN服务器
    Centos7.2yum安装时候出现db5错误的解决办法
    在Centos中yum安装和卸载软件的使用方法(转)
    Centos6.5 恢复误删的系统面板
    ecmall 2.3.0 最新补丁20140618
    ecmall在linux下的安装注意事项(转)
    PHP Strict standards:Declaration of … should be compatible with that of…(转)
  • 原文地址:https://www.cnblogs.com/ios-wanglong/p/5137403.html
Copyright © 2020-2023  润新知