• iOS阶段学习第18天笔记(Plist-Archiver-归档与解归档操作)


    iOS学习(OC语言)知识点整理

    一、归档与解归档的操作

    1)归档是一个过程,将一个或多个对象存储起来,以便以后可以还原,包括将对象存入文件,以后再读取

         将数据对象归档成plist文件

    2)plist文件中只能存放:NSString、NSDate、NSNumber、Bool、NSData、NSArray、NSDictionary

         并且NSArray和NSDictionary中只能是以上的类型

    3)归档存放时数据是什么类型,读取数据时就用什么类型的数据接收。

    4)归档不能直接操作自定义对象类型的数据。

    5)归档与解归档操作实例代码 :     

     1 //创建一个二维数组(数组中每个元素又是一个数组对象)
     2 NSMutableArray *array1=[[NSMutableArray alloc]init];
     3 for(int i=0;i<4;i++){
     4   [array1 addObject:[NSString stringWithFormat:@"str%d",i+1]];
     5 }
     6  
     7 NSMutableArray *array2=[[NSMutableArray alloc]init];
     8  for(int i=0;i<5;i++){
     9    [array2 addObject:[NSNumber numberWithInt:arc4random()%100]];
    10 }
    11 
    12 NSArray *bigArray=@[array1,array2];
    13 //将数组对象写入文件,(先写入内存中,如果写入成功,马上存入文件)
    14 [bigArray writeToFile:@"/Users/kingkong/Desktop/day08/array.plist" atomically:YES];
    15 
    16 //将plist文件的内容直接读取出存入数组
    17 NSArray *newArray=[[NSArray alloc]initWithContentsOfFile:@"/Users/kingkong/Desktop/day08/array.plist"];
    18 NSLog(@"%@",newArray);
    19 
    20 NSArray *emails=@[@"zhangsan@163.com",@"zhangsan@qq.com"];
    21 //创建一个字典对象
    22 NSDictionary *dict=[NSDictionary dictionaryWithObjectsAndKeys:@"zhangsan",@"name",@"123456",@"password",emails,@"email", nil];
    23 //将字典对象写入文件
    24 [dict writeToFile:@"/Users/kingkong/Desktop/day08/dict.plist" atomically:YES];
    25 
    26  //将plist文件的内如读取出来存入字典
    27 NSDictionary *newDict=[NSDictionary dictionaryWithContentsOfFile:@"/Users/kingkong/Desktop/day08/dict.plist"];
    28 NSLog(@"%@",newDict);

    6)归档与解归档自定义类数据 实例代码:

        1、定义一个Birthday类,在.h文件中遵守NSCoding 协议 例如: 

    1 @interface Birthday : NSObject<NSCoding>
    2 //出生日期类,年、月、日
    3 @property(nonatomic,assign)int year;
    4 @property(nonatomic,assign)int month;
    5 @property(nonatomic,assign)int day;
    6 @end

     
       2、在.m文件中实现NSCoding协议方法 例如: 

     1 #import "Birthday.h"
     2 @implementation Birthday
     3 //在归档时自动调用这个方法,将所有的成员变量编码(给成员变量设置相应的键)
    -(void)encodeWithCoder:(NSCoder *)aCoder
    4 { 5 [aCoder encodeInt:_year forKey:@"year"]; 6 [aCoder encodeInt:_month forKey:@"month"]; 7 [aCoder encodeInt:_day forKey:@"day"]; 8 } 9 10 -(id)initWithCoder:(NSCoder *)aDecoder 11 { 12 if(self=[super init]){ 13 _year=[aDecoder decodeIntForKey:@"year"]; 14 _month=[aDecoder decodeIntForKey:@"month"]; 15 _day=[aDecoder decodeIntForKey:@"day"]; 16 } 17 return self; 18 } 19 @end

      

      3、在 main 文件中执行归档与解归档方法 例如: 

     1 Birthday *b=[[Birthday alloc]init];
     2 b.year=2015;
     3 b.month=10;
     4 b.day=25;
     5 
     6 //b必须遵守归档协议
     7 NSString *path=@"/Users/kingkong/Desktop/day09/Birthday.data";
     8 //执行归档操作
     9 BOOL ret=[NSKeyedArchiver archiveRootObject:b toFile:path];
    10 if(ret){
    11 //执行解归档操作
    12 Birthday *b2=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
    13 NSLog(@"year:%i",b2.year);
    14 }

     
    7)将多个对象归档到一个文件中 实例代码
       
     1、定义一个Person类 在.h文件中遵守NSCoding协议 例如: 

    1  #import <Foundation/Foundation.h>
    2   //如果要对对象进行归档,必须遵守归档协议,实现协议中规范的方法
    3   @interface Person : NSObject<NSCoding>
    4   @property(nonatomic,copy)NSString *name;
    5   @property(nonatomic,assign)int age;
    6   -(void)print;
    7   @end

      
     2、在.m中实现协议方法 例如: 

     1   #import "Person.h"
     2    @implementation Person
     3   //在归档时自动调用这个方法,将所有的成员变量编码(给成员变量设置相应的键)
     4   - (void)encodeWithCoder:(NSCoder *)aCoder
     5   {
     6     NSLog(@"%@",NSStringFromSelector(_cmd));
    //encodeInt 用于整型数据 encodeObject 用于字符串或对象
    7 [aCoder encodeObject:_name forKey:@"name"]; 8 [aCoder encodeInt:_age forKey:@"age"]; 9 } 10 //解归档时自动调用此方法 11 - (id)initWithCoder:(NSCoder *)aDecoder 12 { 13 //如果父类也遵守了归档协议,self=[super initWithCode:aDecode] 14 if(self=[super init]){ 15 //根据编码时的键取值decodeIntForKey 用于整型数据 decodeObjectForKey 用于字符串或对象 16 _name=[aDecoder decodeObjectForKey:@"name"]; 17 _age=[aDecoder decodeIntForKey:@"age"]; 18 } 19 return self; 20 } 21 -(void)print 22 { 23 NSLog(@"name:%@,age:%d",_name,_age); 24 } 25 @end

     3、在main文件中执行方法 例如:

     1 Person *p1=[[Person alloc]init];
     2 p1.name=@"kingkong";
     3 p1.age=20;
     4         
     5 NSArray *array1=@[@"red",@"blue",@"yellow"];
     6         
     7 //创建一个对象的缓冲区空间
     8 NSMutableData *mutableData=[[NSMutableData alloc]init];
     9 //创建一个归档器,关联一个对象的缓冲区
    10 NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:mutableData];
    11 //将对象编码后存入缓冲区
    12 [archiver encodeObject:p1 forKey:@"person"];
    13 [archiver encodeObject:array1 forKey:@"array"];
    14 //编码结束
    15 [archiver finishEncoding];//
    16 //将缓冲区中的数据写入到文件中
    17 NSString *path=@"/Users/kingkong/Desktop/day09/doc.data";
    18 BOOL ret=[mutableData writeToFile: path atomically:YES];
    19 NSLog(@"ret=%d",ret);
    20         
    21 //解归档操作
    22 NSData *data=[NSData dataWithContentsOfFile: path];
    23 //创建一个解归档器对象指定数据所在的缓冲区
    24 NSKeyedUnarchiver *unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:data];
    25 //使用解归档器提取数据
    26 Person *p2=[unarchiver decodeObjectForKey:@"person"];
    27 NSArray *array2=[unarchiver decodeObjectForKey:@"array"];
    28 //解归档结束
    29 [unarchiver finishDecoding];
    30 //NSLog(@"%@,%d",p2.name,p2.age);
    31 [p2 print];
    32 NSLog(@"%@",array2);
  • 相关阅读:
    广告电商系统开发功能和源码分享
    定义curl方法 请求接口传输post值,设置header值
    php json保存为utf8
    超越自卑(阿德勒)阅读笔记
    最近的一些事
    BN.2021.1007.1131.简明的Tensorflow2.0
    RX.2021.1004.1546.三维重建.单张图获取深度信息
    RX.2021.1004.1544.图像配准.基于VoxelMorph的脑部MRI配准
    RX.2021.0909.1408.图像分割.基于UNet的OCT血管分割
    RX.2021.0903.1118.图像去噪.基于自监督深度学习的神经活动荧光图像去噪
  • 原文地址:https://www.cnblogs.com/ChinaKingKong/p/4639529.html
Copyright © 2020-2023  润新知