码迷,mamicode.com
首页 > 其他好文 > 详细

Runtime 自动化归档

时间:2015-11-02 10:18:03      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

Runtime的使用

   首先,我们需要利用运行时为我们做到的一步是,通过运行时,获取类中的所有成员属性,这里用到了运行时的方法。

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

   于是我们需要写一个方法,来返回一个数组类中的所有属性名称

 1 // 返回self的所有对象名称
 2 + (NSArray *)propertyOfSelf{
 3     unsigned int count;
 4      
 5 // 1. 获得类中的所有成员变量
 6 Ivar *ivarList = class_copyIvarList(self, &count);
 7  
 8 NSMutableArray *properNames =[NSMutableArray array];
 9 for (int i = 0; i < count; i++) {
10     Ivar ivar = ivarList[i];
11      
12     // 2.获得成员属性名
13     NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
14      
15     // 3.除去下划线,从第一个角标开始截取
16     NSString *key = [name substringFromIndex:1];
17      
18     [properNames addObject:key];
19 }
20  
21 return [properNames copy];
22 }

   在这里,我们已经获取到类中的所有属性的名称,接着我们需要在encodeWithCoder对属性名称和属性的值进行归档操作,在这里我们遇到了一个问题,如何把属性名称和属性的值对应起来呢。

在这里我们需要知道NSStringFromSelector(方法名)返回的是一个SEL变量指向方法名中的方法

我们注意到每个属性都有两个共同的方法那就是set方法和get方法,那么我们只需要通过属性名字,创建属性名指向的方法也就是get方法,就能获取到属性名对应的值。

 1 // 归档
 2 - (void)encodeWithCoder:(NSCoder *)enCoder{
 3 // 取得所有成员变量名
 4 NSArray *properNames = [[self class] propertyOfSelf];
 5  
 6 for (NSString *propertyName in properNames) {
 7     // 创建指向get方法
 8     SEL getSel = NSSelectorFromString(propertyName);
 9     // 对每一个属性实现归档
10     [enCoder encodeObject:[self performSelector:getSel] forKey:propertyName];
11     }
12 }

   接下来,我们需要对类实现解档方法。这里我们遇到第二个问题,如何对属性名的属性进行赋值呢?这里我们需要用到属性的set方法,利用属性名,拼接出一个set方法的字符串,并创建一个指向属性set方法的SEL变量,并且利用performSelector实现赋值

 1 // 解档
 2 - (id)initWithCoder:(NSCoder *)aDecoder{
 3 // 取得所有成员变量名
 4     NSArray *properNames = [[self class] propertyOfSelf];
 5      
 6     for (NSString *propertyName in properNames) {
 7         // 创建指向属性的set方法
 8         // 1.获取属性名的第一个字符,变为大写字母
 9         NSString *firstCharater = [propertyName substringToIndex:1].uppercaseString;
10         // 2.替换掉属性名的第一个字符为大写字符,并拼接出set方法的方法名
11         NSString *setPropertyName = [NSString stringWithFormat:@"set%@%@:",firstCharater,[propertyName substringFromIndex:1]];
12         SEL setSel = NSSelectorFromString(setPropertyName);
13         [self performSelector:setSel withObject:[aDecoder decodeObjectForKey:propertyName]];
14     }
15     return  self;
16 }

   就这样,我们实现了对一个类实现自动归档的类,下次需要创建一个Model类时,只要继承自我们编写的这个类,就能实现自动归档啦,是不是很轻松呢。其实拿到类的属性名可以扩展很多内容,例如我们每次打印Model类的时候,都需要一个model里的属性都拼接出来,利用我们刚刚写的代码,重写description方法,就能实现在NSLog的时候把对象里的每个属性和值都打印出来了

 1 - (NSString *)description{
 2     NSMutableString *descriptionString = [NSMutableString stringWithFormat:@"\n"];
 3     // 取得所有成员变量名
 4     NSArray *properNames = [[self class] propertyOfSelf];
 5     for (NSString *propertyName in properNames) {
 6         // 创建指向get方法
 7             SEL getSel = NSSelectorFromString(propertyName);
 8              
 9         NSString *propertyNameString = [NSString stringWithFormat:@"%@ - %@\n",propertyName,[self performSelector:getSel]];
10         [descriptionString appendString:propertyNameString];
11     }
12             return [descriptionString copy];
13 }

 

参考文档:http://www.cocoachina.com/ios/20151026/13908.html

Runtime 自动化归档

标签:

原文地址:http://www.cnblogs.com/hlfme/p/4929355.html

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