利用运行时进行归档

作者: 搬运工开发者 | 来源:发表于2017-01-11 11:41 被阅读43次

在之前开发的项目中有用到归档和解挡,在项目中用的是比较笨的方法,直接在

  • (void)encodeWithCoder:(NSCoder *)encoder和-(id)initWithCoder:(NSCoder *)decode方法中直接设置每一个属性进行归档和解档,代码如下:
    新建Person类
    Person.h
@interface Person : NSObject <NSCoding>

// 姓名 
@property (copy, nonatomic) NSString *name;
// 年龄 
@property (copy, nonatomic) NSString *age;
// 身高 
@property (copy, nonatomic) NSString *stature;

@end

Person.m

#import "Person.h"

@implementation Person

/** 归档 */
- (void)encodeWithCoder:(NSCoder *)coder{
    [coder encodeObject:self.name forKey:@"name"];
    [coder encodeObject:self.age forKey:@"age"];
    [coder encodeObject:self.stature forKey:@"stature"];
}

/** 解档 */
- (instancetype)initWithCoder:(NSCoder *)coder{
    if (self = [super init]) {
        self.name = [coder decodeObjectForKey:@"name"];
        self.age = [coder decodeObjectForKey:@"age"];
        self.stature = [coder decodeObjectForKey:@"stature"];
    }
    return self;
}

@end

上面的方法虽然可行,但是如果如果类属性比较多的时候那就有点。。。
之前的项目中要进行归档和解档的类一共有20个属性,然后傻逼直接使用上面的方法。。。
但是如果使用runtime获取类的属性代码就简单多了,而且效率还是上面的方法高。

unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([Person class], &count);
    for (int i=0; i<count; i++) {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        NSString *key = [NSString stringWithUTF8String:name];
        NSLog(@"%@", key);
    }

输出结果:


Paste_Image.png

获取到属性之后只要在for循环中进行归档和接档即可。
归档、解档代码如下:

/** 归档 */
- (void)encodeWithCoder:(NSCoder *)coder{
    unsigned int count = 0;
    Ivar *ivars = class_copyIvarList([Person class], &count);
    for (int i=0; i<count; i++) {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        NSString *key = [NSString stringWithUTF8String:name];
        [coder encodeObject:[self valueForKey:key] forKey:key];
    }
}

/** 解档 */
- (instancetype)initWithCoder:(NSCoder *)coder{
    if (self = [super init]) {
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([Person class], &count);
        for (int i=0; i<count; i++) {
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);
            NSString *key = [NSString stringWithUTF8String:name];
            id value = [coder decodeObjectForKey:key];
            [self setValue:value forKey:key];
        }
    }
    return self;
}

相关文章

网友评论

    本文标题:利用运行时进行归档

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