码迷,mamicode.com
首页 > 移动开发 > 详细

iOS--通过runtime完成归档,反归档

时间:2015-06-15 17:59:12      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

通过runtime,不管模型有多少属性,通过几句代码就能完成。

假设person类有N多个属性而是(这里随便写3个)

 

.h

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>

@property (nonatomic, assign) int age;

@property (nonatomic, assign) int height;

@property (nonatomic, copy) NSString *name;

@end

 

.m

#import "Person.h"

#import <objc/runtime.h>

#import <objc/message.h>

@implementation MJPerson

 

- (void)encodeWithCoder:(NSCoder *)encoder

{

    unsigned int count = 0;

    Ivar *ivars = class_copyIvarList([Person class], &count);

    

    for (int i = 0; i<count; i++) {

        // 取出i位置对应的成员变量

        Ivar ivar = ivars[i];

        

        // 查看成员变量

        const char *name = ivar_getName(ivar);

        

        // 归档

        NSString *key = [NSString stringWithUTF8String:name];

        id value = [self valueForKey:key];

        [encoder encodeObject:value forKey:key];

    }

    

    free(ivars);

}

 

- (id)initWithCoder:(NSCoder *)decoder

{

    if (self = [super init]) {

        unsigned int count = 0;

        Ivar *ivars = class_copyIvarList([Person class], &count);

        

        for (int i = 0; i<count; i++) {

            // 取出i位置对应的成员变量

            Ivar ivar = ivars[i];

            

            // 查看成员变量

            const char *name = ivar_getName(ivar);

            

            // 归档

            NSString *key = [NSString stringWithUTF8String:name];

            id value = [decoder decodeObjectForKey:key];

            

            // 设置到成员变量身上

            [self setValue:value forKey:key];

        }

        

        free(ivars);

    }

    return self;

}

 

@end

 

这样写完后,不管属性的多少,runtime都能够完成模型属性的归档与解档,是不是很方便呢。

当然,还可以把.h和.m里面的代码抽成宏,这样以后想要实现复杂对象的存储只需要写两行代码就能搞定。

 

iOS--通过runtime完成归档,反归档

标签:

原文地址:http://www.cnblogs.com/lwdear/p/4578421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!