• OC-归档(序列化)(了解的不多 没细看)


    IOS的本地存储:plist属性列表(Property List),归档,sqlite,coredata

    什么是归档

    归档就是将对象打包成二进制序列

    归档的作用

    归档可以将程序中使用的多个对象及其属性值,以及他们的相互关系保存到文件中 或者发送给另一个进程
    简单点说就是将对象以对象的形式存储在文件中 并且还可以以对象的形式从文件中拿出来

    够可以将相互关联的多个对象归档为二进制文件,

    NSCoding协议

    归档需要先引入协议

    @protovol NSCoding
    -(void)encodeWithCoder:(NSCoder*)aCoder;
    -(id)initWithCoder:(NSCoder*)aDecoder;
    @end
    
    • 1
    • 2
    • 3
    • 4

    NSCoder 是一个抽象类 NSKeyedArchiver和NSKeyedUnarchiver是NSCoder的子类
    NSCoder就相当于一个二进制空间
    NSCoder的实例成为归档器

    -(void)encodeWithCoder:(NSCoder*)aCode//指定对象归档规则

    -(void)encodeWithCoder:(NSCoder*)aCode
    {
    	//如果父类适用于NSCoding协议 则super也需要调用 
    	//[super encoderWithCoder:aCoder];
    	[coder encodeObject:/*归档变量*/ forKey:/*归档名称*/];
    	[coder encodeObject:self.name forKey:@"name"];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    -(id)initWithCoder:(NSCoder*)aDecoder//指定对象解档规则

    //如果父类适用NSCoding协议 则
    //self = [super initWithCoder:aDecoder];
    //如果父类不适用则调用
    //self = [super init];
    接收变量 = [coder decodeObjectForKey:/*归档名称*/];
    self.name = [coder decodeObjectForKey:@"name"];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    NSKeyedArchiver archiveRootObject:toFile: //对目标对象进行归档

    [NSKeyedArchiver archiveRootObject:归档对象 toFile:归档目标路径]
    [NSKeyedArchiver archiveRootObject:a toFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"]
    
    • 1
    • 2

    NSKeyedUnarchiver unarchiveObjectWithFile://通过解档目标文件初始化对象

    A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:目标文件路径];
    A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];
    
    • 1
    • 2

    (id) initForWritingwithMutableData:(NSMutableData*)data

    多对象的
    将预先生成的NSMuable实例作为参数 初始化NSkeyedArchiver实例 这个data的数据会被保留 最后作为归档

    NSMutableData *data = [NSMutableData data];//创建一个data对象
    //根据二进制流创建NSKeyedArchiver对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    //感觉可能是将在archiver和data之间创建一个二进制流
    
    • 1
    • 2
    • 3
    • 4

    [archiver encodeObject:a forKey:@“a”];
    [archiver encodeObject:aa forKey:@“aa”];

    实例

    dog.h

    @interface Dog : NSObject<NSCoding>
    @property (nonatomic,copy)NSString* name;
    @end
    
    • 1
    • 2
    • 3

    dog.m

    #import "dog.h"
    
    @implementation Dog
    -(void)encodeWithCoder:(NSCoder *)coder
    {
        [coder encodeObject:self.name forKey:@"name"];
    }
    -(nullable instancetype)initWithCoder:(NSCoder *)coder
    {
        if(self = [super init])
        {
            self.name = [coder decodeObjectForKey:@"name"];
        }
        return self;
    }
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    main.m

    //
    //  main.m
    //  OCTest
    //
    //  Created by Renkai Yang on 2022/7/26.
    //
    
    #import <Foundation/Foundation.h>
    #import "dog.h"
    @interface A:NSObject<NSCoding>
    @property (nonatomic,copy)NSString *name;
    @property (nonatomic,assign)int age;
    @property (nonatomic,assign)double weight;
    @property (nonatomic,strong)Dog*dog;
    @end
    @implementation A
    -(void)encodeWithCoder:(NSCoder *)coder//设定归档规则
    {
        [coder encodeObject:self.name forKey:@"name"];
        [coder encodeInt:self.age forKey:@"age"];
        [coder encodeDouble:self.weight forKey:@"weight"];
        [coder encodeObject:self.dog forKey:@"dog"];//如果要给自定义类归档解档 就需要在自定义类中制定归档解档规则
    }
    -(nullable instancetype)initWithCoder:(NSCoder *)coder//设定解挡规则
    {
        if(self = [super init])//这里要初始化主要是用来给新对象初始化
        {
            self.name = [coder decodeObjectForKey:@"name"];
            self.age = [coder decodeIntForKey:@"age"];
            self.weight = [coder decodeDoubleForKey:@"weight"];
            self.dog = [coder decodeObjectForKey:@"dog"];
        }
        return self;
    }
    @end
    void test()//进行归档操作
    {
        A *a = [[A alloc]init];
        a.name = @"Yang";
        a.age = 23;
        a.weight = 58.0;
        a.dog = [[Dog alloc]init];
        a.dog.name = @"大黄";
        NSLog(@"归档开始");
        if([NSKeyedArchiver archiveRootObject:a toFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"])//将a对象归档到指定文件中
        {
            NSLog(@"归档成功");
        }
        else
        {
            NSLog(@"归档失败");
        }
    }
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            test();
            A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];//通过解档文件对a进行初始化
            NSLog(@"%@",a.name);
            NSLog(@"%d",a.age);
            NSLog(@"%f",a.weight);
            NSLog(@"%@",a.dog.name);
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    多对象归档
    dog.h

    @interface Dog : NSObject<NSCoding>
    @property (nonatomic,copy)NSString* name;
    @end
    
    • 1
    • 2
    • 3

    dog.m

    #import "dog.h"
    
    @implementation Dog
    -(void)encodeWithCoder:(NSCoder *)coder
    {
        [coder encodeObject:self.name forKey:@"name"];
    }
    -(nullable instancetype)initWithCoder:(NSCoder *)coder
    {
        if(self = [super init])
        {
            self.name = [coder decodeObjectForKey:@"name"];
        }
        return self;
    }
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    main.m

    //
    //  main.m
    //  OCTest
    //
    //  Created by Renkai Yang on 2022/7/26.
    //
    
    #import <Foundation/Foundation.h>
    #import "dog.h"
    @interface A:NSObject<NSCoding>
    @property (nonatomic,copy)NSString *name;
    @property (nonatomic,assign)int age;
    @property (nonatomic,assign)double weight;
    @property (nonatomic,strong)Dog*dog;
    @end
    @implementation A
    -(void)encodeWithCoder:(NSCoder *)coder//设定归档规则
    {
        [coder encodeObject:self.name forKey:@"name"];
        [coder encodeInt:self.age forKey:@"age"];
        [coder encodeDouble:self.weight forKey:@"weight"];
        [coder encodeObject:self.dog forKey:@"dog"];//如果要给自定义类归档解档 就需要在自定义类中制定归档解档规则
    }
    -(nullable instancetype)initWithCoder:(NSCoder *)coder//设定解挡规则
    {
        if(self = [super init])//这里要初始化主要是用来给新对象初始化
        {
            self.name = [coder decodeObjectForKey:@"name"];
            self.age = [coder decodeIntForKey:@"age"];
            self.weight = [coder decodeDoubleForKey:@"weight"];
            self.dog = [coder decodeObjectForKey:@"dog"];
        }
        return self;
    }
    @end
    void test()
    {
        A *a = [[A alloc]init];
        a.name = @"a";
        a.age = 23;
        a.weight = 58.0;
        a.dog = [[Dog alloc]init];
        a.dog.name = @"大黄";
        
        A *aa = [[A alloc]init];
        aa.name = @"aa";
        aa.age = 22;
        aa.weight = 57.0;
        aa.dog = [[Dog alloc]init];
        aa.dog.name = @"大黄1";
        NSLog(@"多对象归档开始");
        NSMutableData *data = [NSMutableData data];
        //根据二进制流创建NSKeyedArchiver对象
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
        //对对象进行归档
        [archiver encodeObject:a forKey:@"a"];
        [archiver encodeObject:aa forKey:@"aa"];
        //结束归档
        [archiver finishEncoding];
        //将二进制流写入文件
        if([data writeToFile:@"/Users/RenkaiYang/Desktop/archive/test.txt" atomically:YES])//将a对象归档到指定文件中
        {
            NSLog(@"归档成功");
        }
        else
        {
            NSLog(@"归档失败");
        }
        
        
        
    //    NSLog(@"归档开始");
          //这里是调用NSKeyedArchiver的对象方法archiveRootObject
    //    if([NSKeyedArchiver archiveRootObject:a toFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"])//将a对象归档到指定文件中
    //    {
    //        NSLog(@"归档成功");
    //    }
    //    else
    //    {
    //        NSLog(@"归档失败");
    //    }
    }
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            test();
    //        //单对象解档
    //        A *a = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];//通过解档文件对a进行初始化
    //        NSLog(@"%@",a.name);
    //        NSLog(@"%d",a.age);
    //        NSLog(@"%f",a.weight);
    //        NSLog(@"%@",a.dog.name);
            //多对象解档
            NSData* data = [NSData dataWithContentsOfFile:@"/Users/RenkaiYang/Desktop/archive/test.txt"];
            
            
            NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
            A *a1 = [unarchiver decodeObjectForKey:@"a"];
            A *a2 = [unarchiver decodeObjectForKey:@"aa"];
            NSLog(@"a1:%@",a1.name);
            NSLog(@"a1:%d",a1.age);
            NSLog(@"a1:%f",a1.weight);
            NSLog(@"a1:%@",a1.dog.name);
            
            NSLog(@"a2:%@",a2.name);
            NSLog(@"a2:%d",a2.age);
            NSLog(@"a2:%f",a2.weight);
            NSLog(@"a2:%@",a2.dog.name);
        }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
  • 相关阅读:
    蓝桥杯练习题七 - 第几天(c++)
    s AbortController 接口取消多次请求 取消上次请求
    【USRP】软件无线电基础篇:短波通信
    电商业务--技术负责人 250K*15
    [论文必备]最强科研绘图分析工具Origin(2)——简单使用教程
    力扣108 补9.17
    计算机毕业设计Java牙科诊所管理系统(源码+系统+mysql数据库+Lw文档)
    苹果或推出多屏幕iPhone;​爱彼迎CEO:办公室时代已过去;Apache Flink 1.15 发布|极客头条
    尚硅谷Flink(四)处理函数
    【音视频】AAC音频压缩格式
  • 原文地址:https://blog.csdn.net/qq_43535469/article/details/126133664