当前位置: 首页 > news >正文

哪家小吃培训网站做的最好百度网址大全官方下载

哪家小吃培训网站做的最好,百度网址大全官方下载,网站策划运营方案书,制作网站什么制作软件在之前介绍的数据存储方法中,不管是NSUserDefaults还是plist文件都不能对自定义对象进行存储,OC提供的解归档恰好解决了这个问题 本片文章对 iOS13 以后的版本 归档和解档 进行介绍。老版本的解归档见这篇文章:【iOS】文件(对象数…

在之前介绍的数据存储方法中,不管是NSUserDefaults还是plist文件都不能对自定义对象进行存储,OC提供的解归档恰好解决了这个问题

本片文章对 iOS13 以后的版本 归档和解档 进行介绍。老版本的解归档见这篇文章:【iOS】文件(对象数据)的归档和解档,参考这篇文章对比学习会对解归档有更好的理解

目录

    • 简介
    • 自定义对象的单个对象归档、解档
    • 多个对象解档归档
    • 嵌套类(复合类)
    • 解档 Success!!
    • 注意
    • MJExtension库(JSONModel、YYModel)


简介

在iOS中,对象的序列化和反序列化分别使用NSKeyedArchiverNSKeyedUnarchiver两个类,我们可以把一个类对象进行序列化然后保存到文件中,使用时再读取文件,把内容反序列化出来。这个过程通常也被称为 对象的编码(归档)和解码(解档)

  • 归档 — 将对象以文件(二进制数据)的形式保存到磁盘上中(也称序列化,持久化)
  • 解档 — 使用时从磁盘上读取该文件的保存路径,从而读取文件的内容(也称反序列化)

归档一般保存自定义对象、自定义对象数组,由于自定义对象不具有归档的性质,所以只有遵循了NSCoding协议的类才可以归档
由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数OC提供的类来说,归档相对而言还是比较容易实现的。

对象归档的文件是保密的,在磁盘上无法查看文件中的内容,而属性列表是明文的,可以查看。通过文件归档产生的文件是不可见的,如果打开归档文件的话,内容是乱码的;ta不同于属性列表和plist文件是可见的,正因为不可见的缘故,使得这种持久性的数据保存更有可靠性

自定义对象的单个对象归档、解档

iOS 13中需要支持NSSecureCoding 协议(父协议为NSCoding)才能支持归档
请添加图片描述

  1. 自定义一个Person类并实现NSCoding 协议的方法
@interface Person : NSObject <NSSecureCoding>@property (nonatomic, copy)NSString* name;
@property (nonatomic, assign)int age;
@property (nonatomic, assign)double weight;@end@implementation Person//NSCoder是一个抽象类
//归档的协议方法
//将归档对象序列化
- (void)encodeWithCoder:(NSCoder *)coder {[coder encodeObject: self.name forKey: @"name"];[coder encodeInt: self.age forKey: @"age"];[coder encodeDouble: self.weight forKey: @"weight"];
}//解档的协议方法
//将解档对象反序列化
- (instancetype)initWithCoder:(NSCoder *)coder {self = [super init];if (self) {self.name = [coder decodeObjectForKey: @"name"];self.age = [coder decodeIntForKey: @"age"];self.weight = [coder decodeDoubleForKey: @"weight"];}return self;
}@end//NSSecureCoding的协议方法
+ (BOOL)supportsSecureCoding {return YES;
}
  1. 初始化待归档对象并进行归档

+ (nullable NSData *)archivedDataWithRootObject:(id)object requiringSecureCoding:(BOOL)requiresSecureCoding error:(NSError **)error;

        Person* person = [[Person alloc] init];person.name = @"XY";person.age = 20;person.weight = 125.0;//归档成二进制数据流NSError* error;NSData* data1 = [NSKeyedArchiver archivedDataWithRootObject: person requiringSecureCoding: YES error: &error];if (error) {NSLog(@"归档错误:%@", error);return 0;}//写入指定路径(一般写入到沙盒,这里方便演示存到一个新的文件夹)[data1 writeToFile: @"/Users/jakey/Desktop/CS/Xcode/NSKeyedArchiverTest/test.archiver" atomically: YES];

Person对象被序列化后就会被保存在下方的文件中,但无法直接打开
请添加图片描述

通过终端命令打开后,可以看到内容是经过加密的,保证了数据的安全性
请添加图片描述

  1. 开始解档

+ (nullable id)unarchivedObjectOfClass:(Class)cls fromData:(NSData *)data error:(NSError **)error;

        //解档此二进制数据error = nil;NSData* data2 = [NSData dataWithContentsOfFile: @"/Users/jakey/Desktop/CS/Xcode/NSKeyedArchiverTest/test.archiver"];Person* unarchiverPerson = (Person *)[NSKeyedUnarchiver unarchivedObjectOfClass: [Person class] fromData: data2 error: &error];if (error) {NSLog(@"解档错误:%@", error);}NSLog(@"unarchiverPerson:%@", unarchiverPerson);

请添加图片描述

多个对象解档归档

将多个对象归档在同一个文件中:

  1. 初始化待归档对象并进行归档
Person* person1 = [[Person alloc] init];
person1.name = @"XY";
person1.age = 20;
person1.weight = 125.0;
Dog* dog1 = [[Dog alloc] init];
dog1.name = @"Bruce";
person1.dog = dog1;     Person* person2 = [[Person alloc] init];
person2.name = @"Jacky";
person2.age = 21;
person2.weight = 130.0;
Dog* dog2 = [[Dog alloc] init];
dog2.name = @"Oudy";
person2.dog = dog2;//创建归档对象
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding: NO];//进行归档(编码)操作
[archiver encodeObject: person1 forKey: @"personOne"];
[archiver encodeObject: person2 forKey: @"personTwo"];//将归档(序列化)后的数据写入指定文件中
[archiver.encodedData writeToFile: @"/Users/jakey/Desktop/CS/Xcode/NSKeyedArchiverTest/test.archiver" atomically: YES];//结束归档
[archiver finishEncoding];
  1. 依次解档
//解档
NSData* data = [NSData dataWithContentsOfFile: @"/Users/jakey/Desktop/CS/Xcode/NSKeyedArchiverTest/test.archiver"];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData: data error: nil];
unarchiver.requiresSecureCoding = NO;Person* unchiverPerson1 = [unarchiver decodeObjectForKey: @"personOne"];
NSLog(@"%@ %d %lf %@", unchiverPerson1.name, unchiverPerson1.age, unchiverPerson1.weight, unchiverPerson1.dog.name);
Person* unchiverPerson2 = [unarchiver decodeObjectForKey: @"personTwo"];
NSLog(@"%@ %d %lf %@", unchiverPerson2.name, unchiverPerson2.age, unchiverPerson2.weight, unchiverPerson2.dog.name);

嵌套类(复合类)

现对于Person类,设置一个自定义对象dog属性,那么这个内层的Dog类也需要实现NSSecureCoding 协议,否则程序会崩溃:

在这里插入图片描述
上面也提到过,OC提供的类(比如这里的name)已经遵循了此协议,因此无需手动操作,但自定义的Dog类要手动添加协议函数:

@interface Dog : NSObject <NSSecureCoding>@property (nonatomic, strong)NSString* name;@end- (void)encodeWithCoder:(NSCoder *)coder {[coder encodeObject: self.name forKey: @"dogName"];
}- (instancetype)initWithCoder:(NSCoder *)coder {self = [super init];if (self) {self.name = [coder decodeObjectForKey: @"dogName"];}return self;
}+ (BOOL)supportsSecureCoding {return YES;
}

以下是复合类解归档完整代码:

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"int main(int argc, const char * argv[]) {@autoreleasepool {Person* person1 = [[Person alloc] init];person1.name = @"XY";person1.age = 20;person1.weight = 125.0;Dog* dog1 = [[Dog alloc] init];dog1.name = @"Bruce";person1.dog = dog1;Person* person2 = [[Person alloc] init];person2.name = @"Jacky";person2.age = 21;person2.weight = 130.0;Dog* dog2 = [[Dog alloc] init];dog2.name = @"Oudy";person2.dog = dog2;//创建归档对象NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding: NO];//进行归档操作[archiver encodeObject: person1 forKey: @"personOne"];[archiver encodeObject: person2 forKey: @"personTwo"];//将归档(序列化)后的数据写入指定文件中[archiver.encodedData writeToFile: @"/Users/jakey/Desktop/CS/Xcode/NSKeyedArchiverTest/test.archiver" atomically: YES];//结束归档[archiver finishEncoding];//解档NSData* data = [NSData dataWithContentsOfFile: @"/Users/jakey/Desktop/CS/Xcode/NSKeyedArchiverTest/test.archiver"];NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData: data error: nil];unarchiver.requiresSecureCoding = NO;Person* unchiverPerson1 = [unarchiver decodeObjectForKey: @"personOne"];NSLog(@"%@ %d %lf %@", unchiverPerson1.name, unchiverPerson1.age, unchiverPerson1.weight, unchiverPerson1.dog.name);Person* unchiverPerson2 = [unarchiver decodeObjectForKey: @"personTwo"];NSLog(@"%@ %d %lf %@", unchiverPerson2.name, unchiverPerson2.age, unchiverPerson2.weight, unchiverPerson2.dog.name);return 0;
}

运行结果如下:

请添加图片描述

解档 Success!!

注意

如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前实现父类的解档和归档方法:[super encodeWithCoder: coder];[super initWithCoder: coder];


MJExtension库(JSONModel、YYModel)

其实还可以使用MJExtension第三方库实现解归档,这样就可以不用写复杂的NSCoding协议,只需要一行代码调用写好的宏MJExtensionCodingImplementation就可以实现

MJExtension也和JSONModel、YYModel一样,支持 JSON数据<->Model 的转换同时也支持解归档,它们在代码量级上、性能优化上各有优缺点,详见这篇文章:

【YYModel,MJExtension,JSONModel对比】

具体的学习,小编日后了解!

http://www.hkea.cn/news/532789/

相关文章:

  • 网站正常打开速度网店营销与推广策划方案
  • 义乌 网站制作进入百度app
  • 做外围网站赌球红树林seo基础入门免费教程
  • 绿色风格网站seo排名赚钱
  • 南宁企业免费建站百度推广营销怎么做
  • 建立个人网站的成本短视频seo营销系统
  • 深圳公司名称大全网站结构优化的内容和方法
  • 安康市代驾公司上海网站关键词排名优化报价
  • 怎么在网站上建设投票统计在线培训系统app
  • 泰州网站建设哪家好网站seo的主要优化内容
  • 洛卡博网站谁做的seo权重查询
  • 东莞网络科技公司有哪些山东网站seo
  • 网站建设需要学什么网站模板购买
  • 用html做的游戏网站关键词推广效果分析
  • 做影视网站引流正规推广平台有哪些
  • 免费下载简历模板北京seo排名厂家
  • 西昌市做网站的百度搜索排名靠前
  • 办公室装修实景拍摄图重庆seo俱乐部联系方式
  • 网站建设阶段推广计划书怎么写
  • 代做毕业设计网站现成注册网站平台
  • 电商网站开发工作计划企业网络营销策划
  • 用wps网站栏目做树形结构图网页设计代码案例
  • 多媒体网站设计开发是指什么每日关键词搜索排行
  • 网站 seo正规网络公司关键词排名优化
  • 建立网站赚多少钱seo收录排名
  • 怎么做app网站seo学习网站
  • 广西建设职业技术学院官网免费的seo优化
  • 凡科网电脑版怎么做网站百度知道官网手机版
  • 贵卅省住房和城乡建设厅网站周口seo推广
  • 搭建flv视频网站seo工具查询