美文网首页
runtime运行时之自动归档(一)

runtime运行时之自动归档(一)

作者: T_Yang | 来源:发表于2017-05-04 17:19 被阅读34次

开发中少不了用到NSKeyedArchiver归档和解档,之前我是这么写的:

//NSCoding实现
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.ID forKey:@"ID"];
}

- (id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        self.ID = [aDecoder decodeObjectForKey:@"ID"];
        self.name = [aDecoder decodeObjectForKey:@"name"];
    }
    return self;
}

这样写很传统,但是如果遇到了归档100个属性呢?那不是完蛋了!?
自此出现这个问题之后,接触到了runtime中<objc/runtime.h>的Ivar,如下:

typedef struct objc_ivar *Ivar;

可见它是一个结构体指针,它定义对象的实例变量,包括类型和名字。包括@interface大括号中的属性和@property中的属性。这也就是它与objc_property_t的区别。
<objc/runtime.h>中声明了

OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount) 

#######这个方法就是copy cls类中@interface中的成员变量和属性,将数量回传给outCount,返回值我们看到了,就是这个Ivar,是个结构体指针,指向了第一个属性结构体的首地址。
#######之后我们利用返回的ivars指针,配合ivar_getname()方法去除字符串形式的变量名称转换成NSString作为key,便可以进行后续操作了
由于是copy操作,后续不要忘记free()释放内存。

我们用运行时的方法实现无论多少属性都通用的归档方法:

- (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++) {
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
            [self setValue:[aDecoder decodeObjectForKey:key] forKey:key];
        }
        free(ivars);
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([self class], &count);
    for (int i = 0; i < count; i++) {
        NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
        [aCoder encodeObject:[self valueForKey:key] forKey:key];
    }
    free(ivars);
}
runtime在实际当中还有很多的应用,之后会慢慢的一一介绍,也算是本人的一个爱好吧,希望读者看到之后点个赞鼓励下,多交流,多指点!

相关文章

  • runtime运行时之自动归档(一)

    开发中少不了用到NSKeyedArchiver归档和解档,之前我是这么写的: 这样写很传统,但是如果遇到了归档10...

  • runtime自动归档

    前言 善用runtime,可以解决自动归档解档。想想以前归档是手动写的,确实太麻烦了。现在有了runtime,我们...

  • runtime自动归档/解档

    前言 善用runtime,可以解决自动归档解档。想想以前归档是手动写的,确实太麻烦了。现在有了runtime,我们...

  • runtime 自动归档

    提到归档这块,首先得看了一下,常规的归档方法(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上;程序运行过...

  • 利用runtime实现归档/反归档

    由于网上这种代码很多,就不一一复写了。以下为转载出处 利用runtime机制归档与反归档objc/runtime之...

  • 鱼人学习小计 (三)

    runtime:runtime又叫运行时,是一套底层c语言api。我们常用的oc语言,编译器会自动转换为运行时语言...

  • iOS利用runtime运行时自动归档、解档

    废话不多说,直接上代码 归档 解档

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

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

  • runtime自动解档归档

    如果你实现过自定义模型数据持久化的过程,那么你也肯定明白,如果一个模型有许多个属性,那么我们需要对每个属性都实现一...

  • RunTime-自动归档方法

    注意,实现NSCoding协议不能使用extension,因为指定构造器不能声明在extension中

网友评论

      本文标题:runtime运行时之自动归档(一)

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