利用runtime进行归档解档

2024-05-06 05:08
文章标签 进行 runtime 解档 归档

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

做过iOS开发的应该都知道数据的本地化的方式,其中归档就是其中的一种。说实话,在本人在项目中并不是很常用归档来进行数据的本地存储。今天之所以写这篇博客是因为最近了解到原来我们还能利用runtime进行归档和解档

先来看一下我们之前的归档、解档代码:

例如我们要对Person这个拥有name和age属性的类的某个对象进行归档,其中Person类中的代码:

#import "Person.h"


@interface Person ()<NSCoding>


@end

@implementation Person


- (void)encodeWithCoder:(NSCoder *)aCoder{

    

    [aCoder encodeObject:_name forKey:@"name"];

    [aCoder encodeObject:_age forKey:@"age"];

}


- (instancetype)initWithCoder:(NSCoder *)coder

{

    self = [super init];

    if (self) {

        _name = [coder decodeObjectForKey:@"name"];

        _age = [coder decodeObjectForKey:@"age"];

    }

    return self;

}

@end

进行归档和解档的代码:

- (IBAction)writeAction:(id)sender {

    NSLog(@"归档");

    Person * person = [Person new];

    person.name = @"梁森";

    person.age = @"26";

    

    NSString * temp = NSTemporaryDirectory();

    NSString * filePath = [temp stringByAppendingPathComponent:@"person.m"];

    NSLog(@"%@", filePath);

    [NSKeyedArchiver archiveRootObject:person toFile:filePath];

}


- (IBAction)readAction:(id)sender {

    NSLog(@"解档");

    NSString * temp = NSTemporaryDirectory();

    NSString * filePath = [temp stringByAppendingPathComponent:@"person.m"];

    

    Person * person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

    NSLog(@"%@  %@", person.name, person.age);

    

}

利用runtime进行归档、解档的归档、解档代码和普通的解档、归档代码一样,不一样的地方就是Person类中的代码:

#import "Person.h"

// 引入运行时头文件

#import <objc/runtime.h>

@interface Person()<NSCoding>


@end

@implementation Person


- (void)encodeWithCoder:(NSCoder *)aCoder{

    //属性的个数

    unsigned int count = 0;

    Ivar * ivars = class_copyIvarList([Person class], &count);

    for (int i = 0; i < count; i++) {

        //取出对应的Ivar

        Ivar ivar = ivars[i];

        //拿到名称

        const char * name = ivar_getName(ivar);

        //OC 字符串

        NSString * key = [NSString stringWithUTF8String:name];

        //归档

        [aCoder encodeObject:[self valueForKey:key] forKey:key];

    }

}

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{

    self = [super init];

    if (self) {

        //属性的个数

        unsigned int count = 0;

        Ivar * ivars = class_copyIvarList([Person class], &count);

        for (int i = 0; i < count; i++) {

            //取出对应的Ivar

            Ivar ivar = ivars[i];

            //拿到名称

            const char * name = ivar_getName(ivar);

            //OC 字符串

            NSString * key = [NSString stringWithUTF8String:name];

            //解档

            id value = [aDecoder decodeObjectForKey:key];

            //KVC--设置值到属性上面!!!

            [self setValue:value forKey:key];

        }

    }

    return self;

}

@end

看起来好像利用runtime的代码反而更多了,其实不然。如果某个类的属性特别多,假设Person这个类有十个属性,那么我们利用之前的方式,Person中的代码就会很多而且都是一些重复的代码。而我们在使用runtime之后不管我们要进行归档的某个类有多少个属性,这个类中的代码都是一样的多。

解读利用runtime归档Person中的代码:

利用runtime中的某些方法我们获取某个类的所有属性个数以及属性名称,然后利用了for循环对类中的所有属性进行归档、解档的操作。同时还利用到了KVC设置值到属性上面。


这篇关于利用runtime进行归档解档的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

如何使用Spring boot的@Transactional进行事务管理

《如何使用Springboot的@Transactional进行事务管理》这篇文章介绍了SpringBoot中使用@Transactional注解进行声明式事务管理的详细信息,包括基本用法、核心配置... 目录一、前置条件二、基本用法1. 在方法上添加注解2. 在类上添加注解三、核心配置参数1. 传播行为(

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存