最近学习了归档与序列化的操做,在进行操做的时候须要为每个类写上归档以及反归档相关的操做 但属性较多时这是一项费力不讨好的事情 遂本身写了个工具类,可以实现自动根据属性个数进行自动序列反序列化操做java
主要运用了ios里runtime的方法与属性 其实在这里是和java的反射机制是同样的。ios
代码总共分为了两种
工具
1.利用分类的方式实现 只须要拷贝分类进入工程 不须要进行其余任何操做 由于分类会对全部的model起做用 因此还有第二种方式供参考学习
2.须要将NSObject继承改成ZJAutoCoding继承code
代码以下,恭敬敬上~~~继承
// // NSObject+ZJAutoCoding.h // // Created by Jason_Msbaby on 15/10/13. // Copyright © 2015年 张杰. All rights reserved. // #import <Foundation/Foundation.h> @interface NSObject (ZJAutoCoding) @end // // NSObject+ZJAutoCoding.m // // Created by Jason_Msbaby on 15/10/13. // Copyright © 2015年 张杰. All rights reserved. // #import "NSObject+ZJAutoCoding.h" #import <objc/runtime.h> @implementation NSObject (ZJAutoCoding) - (instancetype)initWithCoder:(NSCoder *)coder { //获取全部属性 unsigned int count = 0; objc_property_t *pros = class_copyPropertyList(self.class, &count); //遍历属性 for (int i = 0; i < count; i++) { objc_property_t pro = pros[i]; //当前属性对应的名 NSString *proName = [NSString stringWithUTF8String:property_getName(pro)]; unsigned int c = 0; //获取全部特征 objc_property_attribute_t *attrs = property_copyAttributeList(pro, &c); //遍历全部特征 for (int j = 0; j < c; j++ ) { objc_property_attribute_t attr = attrs[j]; //这里的V指的是知道属性对应的成员变量的名称 例如name属性 在这里的特征值则为 V:_name 咱们须要的是_name if (strcmp(attr.name, "V") == 0) { //而后咱们须要获取实例进行赋值操做 Ivar ivar = class_getInstanceVariable(self.class, attr.value); object_setIvar(self, ivar,[coder decodeObjectForKey:proName]); } } free(attrs); } free(pros); return [self init]; } -(void)encodeWithCoder:(NSCoder *)aCoder{ //获取全部的属性 unsigned int count = 0; objc_property_t *pros = class_copyPropertyList([self class], &count); //遍历属性 for (int i = 0; i < count; i++) { objc_property_t pro = pros[i]; unsigned int c = 0; //获取实例变量的名称 NSString *proName = [NSString stringWithUTF8String:property_getName(pro)]; //经过当前的属性 获取该属性的特征 objc_property_attribute_t *attrs = property_copyAttributeList(pro, &c); //遍历特征 可以获得其类型以及数值等内容 for (int j = 0; j < c; j++) { objc_property_attribute_t attr = attrs[j]; if (strcmp(attr.name, "V") == 0) {//若是是特征的名称 //获取当前类对应特征名称的实例变量 Ivar ivar = class_getInstanceVariable(self.class, attr.value); //获得该实例变量的数值 id object = object_getIvar(self, ivar); NSLog(@"%@",object); //归档 [aCoder encodeObject:object forKey:proName]; } } free(attrs); } free(pros); } @end -------------继承的方式以下------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // // ZJAutoCoding.h // // Created by Jason_Msbaby on 15/10/13. // Copyright © 2015年 张杰. All rights reserved. // #import <Foundation/Foundation.h> /** 自动归档序列化 须要继承该类 - returns: */ @interface ZJAutoCoding : NSObject <NSCoding> /** * 全自动动态加载属性 实现反归档 * * @param coder * * @return */ - (instancetype)initWithCoder:(NSCoder *)coder; /** * 全自动动态加载属性 实现归档 * * @param aCoder */ -(void)encodeWithCoder:(NSCoder *)aCoder; @end // // ZJAutoCoding.m // UI高级2 // // Created by Jason_Msbaby on 15/10/13. // Copyright © 2015年 张杰. All rights reserved. // #import "ZJAutoCoding.h" #import <objc/message.h> #import <objc/runtime.h> @implementation ZJAutoCoding - (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { //获取全部属性 unsigned int count = 0; objc_property_t *pros = class_copyPropertyList(self.class, &count); //遍历属性 for (int i = 0; i < count; i++) { objc_property_t pro = pros[i]; //当前属性对应的名 NSString *proName = [NSString stringWithUTF8String:property_getName(pro)]; unsigned int c = 0; //获取全部特征 objc_property_attribute_t *attrs = property_copyAttributeList(pro, &c); //遍历全部特征 for (int j = 0; j < c; j++ ) { objc_property_attribute_t attr = attrs[j]; //这里的V指的是知道属性对应的成员变量的名称 例如name属性 在这里的特征值则为 V:_name 咱们须要的是_name if (strcmp(attr.name, "V") == 0) { //而后咱们须要获取实例进行赋值操做 Ivar ivar = class_getInstanceVariable(self.class, attr.value); object_setIvar(self, ivar,[coder decodeObjectForKey:proName]); } } free(attrs); } free(pros); } return self; } -(void)encodeWithCoder:(NSCoder *)aCoder{ //获取全部的属性 unsigned int count = 0; objc_property_t *pros = class_copyPropertyList([self class], &count); //遍历属性 for (int i = 0; i < count; i++) { objc_property_t pro = pros[i]; unsigned int c = 0; //获取实例变量的名称 NSString *proName = [NSString stringWithUTF8String:property_getName(pro)]; //经过当前的属性 获取该属性的特征 objc_property_attribute_t *attrs = property_copyAttributeList(pro, &c); //遍历特征 可以获得其类型以及数值等内容 for (int j = 0; j < c; j++) { objc_property_attribute_t attr = attrs[j]; if (strcmp(attr.name, "V") == 0) {//若是是特征的名称 //获取当前类对应特征名称的实例变量 Ivar ivar = class_getInstanceVariable(self.class, attr.value); //获得该实例变量的数值 id object = object_getIvar(self, ivar); NSLog(@"%@",object); //归档 [aCoder encodeObject:object forKey:proName]; } } free(attrs); } free(pros); } @end