使用runtime进行归档

    在我们开发日常工作中,经常需要对一些对象进行保存,当然这是一些很轻量级的,我们首先会想到使用NSUserDefaults进行保存,但是NSUserDefaults所能直接保存的对象类型也是有限的,比如NSArray,NSData,NSDictionary,NSNumber,NSString,对于 我们自己建立的模型,NSUserDefaults直接保存的话,就有点力不从心了,这时,我们往往要对模型对象进行归档,归档虽说,实现简单,但是,试想一些,如果你的模型成员比较多,你要每个每个的写几乎重复的代码,或许你坚持写了下来, 如果现在,又增加了一个需要归档的模型,难道,又重复一次上次的代码吗?是不是,会有一种更好地方法,实现一次,多次使用呢,当然有,这里推荐一种使用runtime实现归档的方法。直接上代码,稍后解释。

#import

//根模型的定义

@interface RootModel : NSObject

@end

#import "RootModel.h"

#import@implementation RootModel

- (void)encodeWithCoder:(NSCoder *)aCoder

{

unsigned int count = 0;

Ivar *vars = class_copyIvarList([self class], &count);

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

{

const char *varName = ivar_getName(vars[i]);

NSString *varNameStr = [[NSString alloc ] initWithCString:varName encoding:NSUTF8StringEncoding];

id value = [self valueForKey:varNameStr];

[aCoder encodeObject:value forKey:varNameStr];

}

}

- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder

{

if (self = [super init])

{

unsigned int count = 0;

Ivar *vars =  class_copyIvarList([self class], &count);

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

 {

       const char *varName = ivar_getName(vars[i]);

       NSString *varNameStr = [[NSString alloc] initWithCString:varName   encoding:NSUTF8StringEncoding];

     id value = [aDecoder decodeObjectForKey:varNameStr];

     [self setValue:value forKey:varNameStr];

}

}

return self;

}

如上代码所示,在RootModel根模型中运用运行时进行了归档,以后的model只有继承与RootModel,相应地也就实现了NSCoding协议,不用在一个个的模型实现归档协议。

以下举个小例子:

建立测试模型Person:

#import "RootModel.h"

@interface Person : RootModel

@property(nonatomic,copy)NSString *name;

@property(nonatomic,strong)NSNumber *age;

@property(nonatomic,strong)NSNumber *hight;

@property(nonatomic,copy)NSString *offer;

@end

#import "Person.h"

@implementation Person

@end

//使用

- (void)viewDidLoad

{

[super viewDidLoad];

Person *pson = [[Person alloc ] init];

pson.name = @"呵呵呵";

pson.age = @19;

pson.hight = @170;

pson.offer = @"dev";

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:pson];

[[NSUserDefaults standardUserDefaults] setValue:data forKey:@"person"];

}

以上代码对Person对象进行了归档,并存储到了NSUserDefaults中,现在尝试取出保存的数据。

- (void)viewDidLoad

{

[super viewDidLoad];

[[NSUserDefaults standardUserDefaults] synchronize];

NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"person"];

Person *pson = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSLog(@"person:%@",pson);

}

使用runtime进行归档_第1张图片

如上图所示,成功将保存在NSUserDefaults的对象取出。就写到这吧。

呵呵,一直以来都是看别人的写的东西,很是自己写点什么,总是让人感觉浪费时间,现在想想 写点东西记录一下 还是挺好的 于人于己 都有帮助,挺好的。

你可能感兴趣的:(使用runtime进行归档)