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

相关文章

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

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三