您的位置:首页 > 移动开发 > IOS开发

利用runtime 实现自定义Model归档

2016-02-23 11:11 375 查看
直接代码:

Model 归档

@interface BModel : NSObject <NSCoding>

/**
* 对象的唯一id
*/
@property (nonatomic,strong) NSNumber *guid;
/**
* 创建时间
*/
@property(nonatomic,strong) NSString *created_at;
/**
* 对象类型
*/
@property(nonatomic,strong) NSString *object_name;

/**
* 归档
*
* @param path 路径
*
* @return 成功YES 失败NO
*/
- (BOOL)archiveRootObjectWithPath:(NSString *)path;
/**
* 解档
*
* @param path 路径
*
* @return 成功YES 失败NO
*/
- (id)unarchiveObjectWithFileWithPath:(NSString *)path;
@end

#import "BModel.h"
#import <objc/runtime.h>

@implementation BModel

- (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++) {
// 取出i位置对应的成员变量
Ivar ivar = ivars[i];

// 查看成员变量
const char *name = ivar_getName(ivar);

// 归档
NSString *key = [NSString stringWithUTF8String:name];
id value = [aDecoder decodeObjectForKey:key];

// 设置到成员变量身上
[self setValue:value 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++) {

// 取出i位置对应的成员变量
Ivar ivar = ivars[i];

// 查看成员变量
const char *name = ivar_getName(ivar);

// 归档
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[aCoder encodeObject:value forKey:key];
}
}
- (BOOL)archiveRootObjectWithPath:(NSString *)path{

return [NSKeyedArchiver archiveRootObject:self toFile:path];

}
- (id)unarchiveObjectWithFileWithPath:(NSString *)path{

return [NSKeyedUnarchiver unarchiveObjectWithFile:path];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息