利用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

相关文章

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

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

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

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y