美文网首页
iOS-Runtime实现对象的归档/解档

iOS-Runtime实现对象的归档/解档

作者: 见哥哥长高了 | 来源:发表于2018-12-21 22:47 被阅读3次

工作中,Runtime实现对象的归档/解档的功能经常用到。之前没有做整理,今天特意整理了一下,也算作为一个知识点吧。方便自己的学习巩固。

其实,这个功能实现起来很简单。就下面几步:
第一步:创建类,遵守NSCoding协议
第二步:实现NSCoding协议中的两个方法

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

第三步:利用NSKeyedArchiver归档/NSKeyedUnarchiver解档

接下来,我就新建一个类CustomClass,随便添加几个属性,来利用以上步骤实现该功能。

#import <Foundation/Foundation.h>

@interface CustomClass : NSObject<NSCoding>

//随便添加了几个属性
@property(nonatomic,copy)NSString *attribute1;

@property(nonatomic,copy)NSString *attribute2;

@property(nonatomic,assign)NSInteger attribute3;

@property(nonatomic,assign)BOOL attribute4;

@end

CustomClass.m中的实现代码:

#import "CustomClass.h"
#import <objc/runtime.h>
@implementation CustomClass
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder{
    unsigned int count = 0;
    //取到所有的Ivar
    Ivar *ivars = class_copyIvarList([self class], &count);
    //遍历 逐个属性归档
    for (int i = 0; i < count; i++) {
        //找到Ivar
        Ivar ivar = ivars[i];
        //找到Ivar对应的名称
        const char *name = ivar_getName(ivar);
        //找到key
        NSString *key = [NSString stringWithUTF8String:name];
        //key对应的value值
        id value = [self valueForKey:key];
        //键值保存
        [aCoder encodeObject:value forKey:key];
    }
    free(ivars);
}

//解档
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
    
    self = [super init];
    if (self) {
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([self class], &count);
        for (int i = 0; i < count; i++) {
            //拿到每一个Ivar 在这里拿到的是数组的首地址
            Ivar ivar = ivars[i];
            //ivar对应的名称
            const char *name = ivar_getName(ivar);
            //属性key
            NSString *key = [NSString stringWithUTF8String:name];
            //属性value
            id value = [aDecoder decodeObjectForKey:key];
            //KVC 将值设置到对应的属性上面
            [self setValue:value forKey:key];
        }
        free(ivars);
    }
    return self;
}
@end

接下来就是具体的应用:

    CustomClass *model = [[CustomClass alloc]init];
    
    model.attribute1 = @"刘高见";
    model.attribute2 = @"我是谁";
    model.attribute3 = 20;
    model.attribute4 = YES;
    //路径
    NSString *path = NSTemporaryDirectory();
    NSString *filePath = [path stringByAppendingString:@"liugaojian.file"];
    //归档
    [NSKeyedArchiver archiveRootObject:model toFile:filePath];

//取

    //路径
    NSString *path = NSTemporaryDirectory();
    NSString *filePath = [path stringByAppendingString:@"liugaojian.file"];
    
    //归档
   CustomClass *model = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

    NSLog(@"attribute1=%@-------attribute2=%@-------attribute3=%ld--------attribute4=%d",model.attribute1,model.attribute2,(long)model.attribute3,model.attribute4);

哈哈 over~~~

相关文章

  • iOS-Runtime实现对象的归档/解档

    工作中,Runtime实现对象的归档/解档的功能经常用到。之前没有做整理,今天特意整理了一下,也算作为一个知识点吧...

  • 数据持久化-归档、解档

    模型对象实现归档和解档代理方法 解档 宏定义路径 归档 任何地方只要动了数组都要归档

  • IOS-归档。 使用MJExtension 快速实现对象的归档。

    使用MJExtension 快速实现对象的归档,省去大量繁琐的归档,解档代码。 第一步:对象必须要实现NSCodi...

  • iOS 【NSKeyedArchier】归档解档类名调整问题

    归档解档的是自定义的对象,归档时是A名字,当对象名调整之后,解档是B名字; *** Terminating app...

  • ios 归档与解档

    将对象进行归档或者解档时,需要遵循NSCoding协议,对象必须实现encodeWithCoder方法和initW...

  • 归档与解档

    归档:将对象按照一定的格式保存到文件中;解档:从文件中还原对象的过程 官方类的归档与解档方式一: 官方类的归档与解...

  • OC NSArray&NSMutableArray,解归

    解归档: 对象实现NSCoding协议,实现两个方法 归档 解归档 NSArrary & NSMutableArr...

  • 归档/解档

    一、对系统类进行归档/解档 第一种:对集合类对象进行归档/解档 归档: 解档 方法(1) 方法(2) 第二种:非集...

  • runtime使用 自定义数据类型的编码解码

    通过runtime 遍历自定义model的所有属性实现归档解档操作。 要实现我们自定义的model能够自动解档归档...

  • 归档 & 解档

    1.什么是 归档 和 解档 数据本地存储持久化的一种。归档:对象的序列化,通过某种格式把对象保存成本地文件。解档:...

网友评论

      本文标题:iOS-Runtime实现对象的归档/解档

      本文链接:https://www.haomeiwen.com/subject/sgkbkqtx.html