IOS 14.5版本之解档和归档的API学习

第一部分 回顾一下老api的使用,将对象持久化至硬盘里面。

1.为什么我们要学习解档和归档,
有什么作用。当 plist 文件存储无法满足我们的需求的时候,或者 用户偏好设置无法存储我们自定义的对象的时候,就需要解档和归档的知识上场了。首先我们体验一下IOS12之前API的 解档和归档的知识。IOS12之后,苹果替换了之前的写法了。
我们需要重写学习。不要念想之前的api函数,没有意义。苹果既然要废弃之前的写法,肯定有它的道理,无需深究。时代在进步,科技在进步。


解档和归档 是针对一个对象进行存储的。直接把对象存储在一个abc.arc,或者abc.data里面,放在哪,放在沙盒路径的documents目录下,沙盒的根目录是NSHomeDirection(). 打印的,返回值类型是字符串,关于返回值类型不知道的,可以按住option 鼠标点击那个类,就看到了。 不知道一些控件的具体方法,可以跳到头文件,看看源代码的实现方法,就可以了,ctrl + command + J 是跳入头文件的利器,必须滚瓜烂熟。
对象的归档和解档,和Java 的加密有点像,有encode方法和decode 方法,学会类比学习。
首先定义一个Person类,写三个属性。,并实现NSCoding协议

@interface HMPerson : NSObject <NSCoding>
@property(nonatomic,copy)NSString * name1;
@property(nonatomic,assign)int age;
@property(nonatomic,assign)double hei;
@end

实现NSCoding协议内的两个方法。协议方法记不得,可以跳到头文件看一看。一个解档用的,一个归档用的,说简单点,一个是存数据的,一个是读取数据的。

#import "HMPerson.h"
@implementation HMPerson
/**当将一个自定义的对象保存到文件的中必须实现NSCoding协议*/
///在该方法中说明如何存储自定义对象的对象
//也就是说该方法中说清楚存储自定义对象的哪些属性
- (void)encodeWithCoder:(NSCoder *)coder{//归档用的,重写父类的方法,从NSCoding 协议获取[coder encodeObject:self.name1 forKey:@"name1"];[coder encodeInt:self.age forKey:@"age"];[coder encodeDouble:self.hei forKey:@"hei"];
}
- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {//解档用的,解挡会重写 NSCoding协议 里面未实现的方法if(self = [super init]){self.name1 = [coder decodeObjectForKey:@"name1"];self.age = [coder decodeIntForKey:@"age"];self.hei = [coder decodeFloatForKey:@"hei"];}return self;
}
@end

storyboard拖两个按钮,一个读,一个写,连线至viewController.m 里面,并选取action动作,自己随便起个名字,略过…

#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,copy)NSString * path;
@end
@implementation ViewController
- (NSString *)path{if(!_path){NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];_path = [doc stringByAppendingPathComponent:@"person.arc"];}return _path;
}
- (IBAction)read:(id)sender {//直接解挡HMPerson *p2 = [NSKeyedUnarchiver unarchiveObjectWithFile:self.path];NSLog(@"%@,%d,%lf",p2.name1,p2.age,p2.hei);
}
- (IBAction)saveObject:(id)sender {//1.创建对象HMPerson *p1 = [HMPerson new];p1.name1 = @"daJun";p1.age = 22;p1.hei = 183;NSLog(@"%@",self.path);//2.把对象进行归档[NSKeyedArchiver archiveRootObject:p1 toFile:self.path];
}
@end

2021-06-10 11:12:42.042287+0800 01-归档知识[7791:611590] daJun,22,183.000000

Finder 下,command + shift + G ,是前往文件夹,这个快捷键必须记住。
finder下,ctrl + command + . 是取消隐藏文件 或者 隐藏文件的。必须知道。
最后看到控制台打印读取到的内容,证明原先api可以使用,只是编译器报了大大的警告,说这个函数在ios12被提出反对,使用xxx进行了替换。咱们就使用它提示的函数进行第二轮测试。

第二部分,新API的使用,将对象持久化至硬盘里面。

定义一个Person类,里面实现两个协议,<NSCoding,NSSecureCoding>
实现协议内的三个方法。不要问为什么。就是这样干的

@interface HMPerson : NSObject <NSCoding,NSSecureCoding>
@property(nonatomic,copy)NSString * name1;
@property(nonatomic,assign)int age;
@property(nonatomic,assign)double hei;
@end
#import "HMPerson.h"
@implementation HMPerson
//当将一个自定义的对象保存到文件的中必须实现NSCoding协议
//在该方法中说明如何存储自定义对象的对象
//也就是说该方法中说清楚存储自定义对象的哪些属性
- (void)encodeWithCoder:(NSCoder *)coder{//归档用的,重写父类的方法,从NSCoding 协议获取[coder encodeObject:self.name1 forKey:@"name1"];[coder encodeInt:self.age forKey:@"age"];[coder encodeDouble:self.hei forKey:@"hei"];
}
- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {//解挡用的,解挡会重写 NSCoding协议 里面未实现的方法if(self = [super init]){self.name1 = [coder decodeObjectForKey:@"name1"];self.age = [coder decodeIntForKey:@"age"];self.hei = [coder decodeFloatForKey:@"hei"];}return self;
}
+ (BOOL)supportsSecureCoding{return YES;
}
@end

搞个成员变量属性,给他一下设置懒加载,初始化一下为沙盒目录的documents目录里面。

@property(nonatomic,copy)NSString * finalPath;
//懒加载
- (NSString *)finalPath{if(!_finalPath){NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];_finalPath  = [doc stringByAppendingPathComponent:@"abcd.arc"];NSLog(@"%@",NSHomeDirectory());}return _finalPath;
}

归档action按钮代码

- (IBAction)guidang:(id)sender {HMPerson *p1 = [HMPerson new];p1.name1 = @"jack";p1.age = 18;p1.hei = 1.83;NSError *error;NSData *da = [NSKeyedArchiver archivedDataWithRootObject:p1 requiringSecureCoding:YES error:&error];if(da==nil || error){NSLog(@"%@",error);}[da writeToFile:self.finalPath atomically:YES];
}

解档Action按钮代码如下

- (IBAction)jiedang:(id)sender {HMPerson * p2= [NSKeyedUnarchiver unarchivedObjectOfClass:[HMPerson class] fromData:[NSData dataWithContentsOfFile:self.finalPath] error:nil];NSLog(@"%@,%d,%lf",p2.name1,p2.age,p2.hei);NSLog(@"%@",@"这是解档后的内容打印");
}

注意,先归再解,有先后之分的顺序之分的。这是IOS12以后的解档归档基础知识,资源文件为: ios12解档和归档.zip,在我的主页下面。整个编写过程,能不用鼠标,尽量不要使用鼠标,全部用快捷键,操作各个编辑页面。使用鼠标很慢,mac的主要思想是全程使用键盘。

第三部分,解档归档,带数组的存储,即数组类型 的存储和读取。

@interface HMPerson : NSObject<NSCoding,NSSecureCoding>
@property(nonatomic,copy)NSString * name;
@end
#import "HMPerson.h"
@implementation HMPerson
- (void)encodeWithCoder:(NSCoder *)coder{[coder encodeObject:self.name forKey:@"name"];
}
- (instancetype)initWithCoder:(NSCoder *)coder{if(self=[super init]){self.name = [coder decodeObjectForKey:@"name"];}return self;
}
+ (BOOL)supportsSecureCoding{return YES;
}
- (NSString *)description
{return [NSString stringWithFormat:@"<%@,%p>{name: %@}", [self class],self,self.name];
}
@end

数组的读取与写入方法的实现,就解档和归档的具体实现,测试,由于重新父类的descration 方法,打印arr才看得清楚。

- (IBAction)w:(id)sender {HMPerson *p = [HMPerson new];p.name = @"Jack";HMPerson *p2 = [HMPerson new];p2.name = @"LuJun";HMPerson *p3 = [HMPerson new];p3.name = @"rose";NSArray *arr = @[p,p2,p3];NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr requiringSecureCoding:YES error:nil];NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString * path =[doc stringByAppendingPathComponent:@"dc.data"];[data writeToFile:path atomically:YES];NSLog(@"%@",NSHomeDirectory());}
- (IBAction)r:(id)sender {NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString * path =[doc stringByAppendingPathComponent:@"dc.data"];NSSet *set = [NSSet setWithObjects:[NSArray class],[HMPerson class], nil];NSData *data = [NSData dataWithContentsOfFile:path];NSArray *arr2 = [NSKeyedUnarchiver unarchivedObjectOfClasses:set fromData:data error:nil];NSLog(@"%@",arr2);for(HMPerson *item in arr2){NSLog(@"%@",item.name);}
}

第四部分 带继承的类的归档和解档

#import "HMStudent.h"
@implementation HMStudent
- (void)encodeWithCoder:(NSCoder *)coder{[super encodeWithCoder:coder];[coder encodeDouble:self.weight forKey:@"weight"];
}
- (instancetype)initWithCoder:(NSCoder *)coder{if(self = [super initWithCoder:coder]){self.weight = [coder decodeDoubleForKey:@"weight"];}return self;
}
+ (BOOL)supportsSecureCoding{return YES;
}
@end
- (IBAction)gui2:(id)sender {HMStudent *stu = [HMStudent new];stu.name1 = @"Lili";stu.age = 22;stu.weight = 58.8;NSError *err;NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stu requiringSecureCoding:YES error:&err];if(data==nil || err){NSLog(@"%@",err.description);}[data writeToFile:self.pathss atomically:YES];
}- (IBAction)jie:(id)sender {NSData *data=[NSData dataWithContentsOfFile:self.pathss];HMStudent *str=[NSKeyedUnarchiver unarchivedObjectOfClass:[HMStudent class] fromData:data error:nil];NSLog(@"%@,%d,%lf",str.name1,str.age,str.weight);
}
@end

有个学生类继承了父类Person类,要用super调用父类的归档,initWithCoder 也要调用父类的。否则有问题。
不重写父类的三个方法,创建子类对象,默认调用父类的方法,导致子类自己的属性无法得到归档,。重写了父类的三个方法,不调用父类超类方法,仅仅保存子类的属性内容,子类一旦重新父类方法,实例化子类对象,将不会调用父类方法了。这点要知道。

IOS 14.5版本之解档和归档的API学习相关推荐

  1. 【iOS数据持久化】归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)

    简介 归档(Archive)也称为序列化(serialization),把对象转化为字节码,以文件的形式存储在磁盘上,只要遵循了NSCoding协议的对象都可以实现归档和解档(大部分foundatio ...

  2. 不越狱换壁纸_终于来了!iOS 14.3 正式版,可自动定时换壁纸

    嘿嘿,我没有猜错吧!iOS 14.3 正式版会在12月15日凌晨时段发布,在前几天我就有提到,这一天会发布,主要是与新品 AirPods Max 发售时间与iOS 14.3正式版发布时间一致. 其次这 ...

  3. 苹果关闭iOS 14.1验证通道,阻止 iOS 14.2 降级

    11月13日消息,据国外媒体报道,今日苹果推出了iOS 14.3,但推出后瞬间撤回.尽管如此,苹果还是执意关闭了iOS 14.1系统的验证通道.这意味着更新到 iOS 14.2 的用户无法再降级到 i ...

  4. ip电池测试软件,IOS 14.6渣优化:测试发现7款iPhone电池寿命下降

    上周正式推出iOS 14.6版本.虽然之前版本的性能下降("降速")是固定的,但是看起来价格是以牺牲电池寿命为代价的. 所以不是无中生有.IAppleBytes找到了iPhone ...

  5. JSON转模型归档与解档

    1.用户账户模型类 UserAccount.swift ///用户账户模型 class UserAccount: NSObject, NSCoding{//用户授权的唯一票据,用于调用微博的开放接口, ...

  6. ios5.1.1旧版软件下载_苹果iOS 14.1正式版推送 关闭旧版本降级通道

    上周,苹果正式发布了iOS14.1 正式版.而就在今天,苹果则停止了对iOS 14.0.1的验证.这样的举措意味着用户将无法再降级到这一版本. 苹果iOS 14.1正式版推送 关闭旧版本降级通道 iO ...

  7. iOS问题记录 - Xcode 14.3版本运行项目报错

    文章目录 前言 开发环境 问题描述 问题分析 解决方案 最后 前言 看到Xcode有新版本,没忍住点了升级,然后问题来了. 2023/04/23更新:关于Xcode 14.3版本目前涉及到的三个问题, ...

  8. iOS - iOS 12 之后的归档(NSKeyedArchiver)、解档(NSKeyedUnarchiver)用法

    一.iOS 12 之后旧的归档解档方法废弃了,更改为: 归档: + (nullable NSData *)archivedDataWithRootObject:(id)object requiring ...

  9. 请把ios文件解压出来是什么意思_【张小亮】最新版本行会3。中文版本。解压即玩。...

    电脑游戏目录[回复:电脑游戏] 手机游戏目录[回复:手机游戏] [张小亮]最新版本行会3.中文版本.解压即玩. [名称]行会3 [大小]4.12 GB [版本]v0.9.9 [系统]电脑游戏 [下载] ...

最新文章

  1. gcc选项 和 gdb 使用
  2. 【机器学习】孤立森林-一个通过瞎胡乱分进行异常检测的算法
  3. Spring Boot-@EnableWebMvc注解
  4. FormsAuthentication 和 Session 超时时间不一的问题
  5. layui自带验证体系:手机号验证、邮箱验证、必填项非空验证、数字验证(含代码、案例)
  6. 14002.petalinux编译配置项目
  7. MangoDB索引、排序和聚合
  8. 安装完Fedora 18后需要做的事情
  9. 自学编程,痛并快乐着
  10. 第一周校内OI模拟赛总结(day1day2)
  11. [CSS] 浮动 float属性、clear属性详解
  12. 木兰在线英语词典 -- 溯源拆分记单词
  13. c语言程序设计医院就医,C语言程序设计(医院信息管理系统)附源代码[精品].doc...
  14. SpringBoot(二)Error resolving template “xxx”, template might not exist or might not be accessible解决办法
  15. 关于消息队列ActiveMQ、RocketMQ、RabbitMQ、Kafka原理机制以及优劣势的分析
  16. stem什么意思matlab,matlab中stem函数用法_常见问题解析,matlab
  17. web前端面试十大 难点问题
  18. WAVE绘制频谱图(三)——PCM数据处理以及图谱显示
  19. 杰理之静电测试标准及放电特性【篇】
  20. Windows server 2012 R2服务器上的SqlServer数据库无法用公网IP远程访问

热门文章

  1. php购票排位_用PHP+MySQL实现12306购票和退票以及余票查询逻辑
  2. 大学生python实验心得体会_大学生实验心得体会精选例文【三篇】
  3. python中词云图是用来描述_python中实现词云图
  4. python单位根检验看结果_Python ADF 单位根检验 如何查看结果的实现
  5. 嵌入式与单片机之间的关系是什么?
  6. 商业逻辑12讲之管理沟通的逻辑
  7. php程序怎么调试,你是怎么调试PHP代码的
  8. php中update语句修改多个字段,Myabtis中批量更新update多字段
  9. matlab播放 视频帧,如何把连续视频帧转为视频的matlab代码 | 学步园
  10. python 百度百科 爬虫_爬虫爬取百度百科数据