Runtime--将信息对象归档解档

2023-10-04 04:59

本文主要是介绍Runtime--将信息对象归档解档,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法。例如有一个Person类,该类有两个成员变量

1
2
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign)  int  age;

两个协议的实现方法如下

复制代码
/***  将对象写入某个文件时需要调用,在该方法中说明哪些属性需要存储*/
- (void)encodeWithCoder:(NSCoder *)encoder
{[encoder encodeObject:self.name forKey:@"name"];[encoder encodeInt:self.age forKey:@"age"];
}/***  从文件中解析对象时会调用,在该方法中解析对象的属性*/
- (id)initWithCoder:(NSCoder *)decoder
{if (self = [super init]) {// 解析之后要赋值给属性_name = [decoder decodeObjectForKey:@"name"];_age = [decoder decodeIntForKey:@"age"];}return self;
}
复制代码

但当该类拥有上百个属性时,那将会花费更多的功夫在重复代码上,所以使用运行时机制截取类的成员变量,进行赋值

 

例如有一个狗类Dog和它的父类动物类Animal

狗类的成员变量有

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;

 

动物类的成员变量有

@property (nonatomic,assign) double weight;

 

当我们需要将狗对象进行归档时,可以在类中这样重写归档和解档方法

复制代码
- (id)initWithCoder:(NSCoder *)aDecoder
{if (self = [super init]) {Class c = self.class;// 截取类和父类的成员变量while (c && c != [NSObject class]) {unsigned int count = 0;Ivar *ivars = class_copyIvarList(c, &count);for (int i = 0; i < count; i++) {NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];id value = [aDecoder decodeObjectForKey:key];[self setValue:value forKey:key];}// 获得c的父类c = [c superclass];free(ivar);}}return self;
}- (void)encodeWithCoder:(NSCoder *)aCoder
{Class c = self.class;// 截取类和父类的成员变量while (c && c != [NSObject class]) {unsigned int count = 0;Ivar *ivars = class_copyIvarList(c, &count);for (int i = 0; i < count; i++) {Ivar ivar = ivars[i];NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];id value = [self valueForKey:key];[aCoder encodeObject:value forKey:key];}c = [c superclass];// 释放内存
        free(ivar);}}
复制代码

 

 代码测试:

复制代码
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{CXDog *d = [[CXDogalloc] init];d.name = @"cx";d.age = 12;d.weight = 1.55;// 将对象归档[NSKeyedArchiverarchiveRootObject:d toFile:@"/Users/c_xie/Desktop/wj.xxoo"];// 将对象解档CXDog *dog = [NSKeyedUnarchiverunarchiveObjectWithFile:@"/Users/c_xie/Desktop/wj.xxoo"];NSLog(@"%@,%d,%f",dog.name,dog.age,d.weight);}
复制代码

这篇关于Runtime--将信息对象归档解档的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1330

相关文章

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和