IOS利用objc/runtime和KVC——快速归档解档
2016-03-07 18:43
423 查看
开发过程中有时需要存储一些轻量级的数据,对于IOS提供的几种数据存储方式在这时最合适当属对象归档:NSCoding
但是将对象数据进行归档解档时候需要实现两个方法: encodeWithCoder和initWithEncoder。encodeWithCoder就是编码,initWithCoder就是解码。
encodeWithCoder方法传入的是一个NSCoder对象,实现的时候我们就可以调用encodeObject、encodeFloat、 encodeInt等各种方法并通过指定键值进行编码,而
在需要的时候调用decodeDoubleForKey,decodeFloatForKey,decodeObjectForKey进行解码。
1.实现encodeWithCoder和initWithEncoder
写完之后发现整个人都不好了,如果对象属性更多,这些重复性的代码也意味着要被Command+C Command+V着N次,累觉无爱。
然后尝试用其他方式进行,既然Objective-C运行时库提供了非常便利的方法获取其对象运行时所属类及其所有成员变量,并通过KVC进行值的存取,那么或者可以这样objc/runtime+KVC
导入#import <objc/runtime.h>头文件
好用,继续,利用KVC进行取值,根据属性名称获取对应的值
最终改后的程序:
原帖:http://www.daxueit.com/article/6126.html
但是将对象数据进行归档解档时候需要实现两个方法: encodeWithCoder和initWithEncoder。encodeWithCoder就是编码,initWithCoder就是解码。
encodeWithCoder方法传入的是一个NSCoder对象,实现的时候我们就可以调用encodeObject、encodeFloat、 encodeInt等各种方法并通过指定键值进行编码,而
在需要的时候调用decodeDoubleForKey,decodeFloatForKey,decodeObjectForKey进行解码。
1.实现encodeWithCoder和initWithEncoder
#import "MyModel.h" @implementation MyModel #define kCUSTIDKey @"CUSTIDKey" #define kCUSTSTATUSKey @"CUSTSTATUSKey" #define kPICTUREIDKey @"PICTUREIDKey" #define kUNITNUMKey @"UNITNUMKey" #define kCITYIDKey @"CITYIDKey" #define kCUSTNAMEKey @"CUSTNAMEKey" #define kCOMMUNITYNAMEKey @"COMMUNITYNAMEKey" #define kRESERVE1Key @"RESERVE1Key" #define kCITYKey @"CITYKey" #define kCOMMUNITYIDKey @"COMMUNITYIDKey" #define kCITYNAMEKey @"CITYNAMEKey" #define kBUILDINGNUMKey @"BUILDINGNUMKey" #define kNICKNAMEKey @"NICKNAMEKey" #define kHOUSENUMKey @"HOUSENUMKey" #define kPHONEKey @"PHONEKey" //归档 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:self.CUSTID forKey:kCUSTIDKey]; [aCoder encodeObject:self.CUSTSTATUS forKey:kCUSTSTATUSKey]; [aCoder encodeObject:self.PICTUREID forKey:kPICTUREIDKey]; [aCoder encodeObject:self.UNITNUM forKey:kUNITNUMKey]; [aCoder encodeObject:self.PHONE forKey:kPHONEKey]; [aCoder encodeObject:self.CITYID forKey:kCITYIDKey]; [aCoder encodeObject:self.CUSTNAME forKey:kCUSTNAMEKey]; [aCoder encodeObject:self.COMMUNITYNAME forKey:kCOMMUNITYNAMEKey]; [aCoder encodeObject:self.RESERVE1 forKey:kRESERVE1Key]; [aCoder encodeObject:self.CITY forKey:kCITYKey]; [aCoder encodeObject:self.COMMUNITYID forKey:kCOMMUNITYIDKey]; [aCoder encodeObject:self.CITYNAME forKey:kCITYNAMEKey]; [aCoder encodeObject:self.BUILDINGNUM forKey:kBUILDINGNUMKey]; [aCoder encodeObject:self.NICKNAME forKey:kNICKNAMEKey]; [aCoder encodeObject:self.HOUSENUM forKey:kHOUSENUMKey]; } // 解档 - (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { self.CUSTID = [decoder decodeObjectForKey:kCUSTIDKey]; self.CUSTSTATUS = [decoder decodeObjectForKey:kCUSTSTATUSKey]; self.PICTUREID = [decoder decodeObjectForKey:kPICTUREIDKey]; self.PHONE = [decoder decodeObjectForKey:kPHONEKey]; self.UNITNUM = [decoder decodeObjectForKey:kUNITNUMKey]; self.CITYID = [decoder decodeObjectForKey:kCITYIDKey]; self.CUSTNAME = [decoder decodeObjectForKey:kCUSTNAMEKey]; self.COMMUNITYNAME = [decoder decodeObjectForKey:kCOMMUNITYNAMEKey]; self.RESERVE1 = [decoder decodeObjectForKey:kRESERVE1Key]; self.CITY = [decoder decodeObjectForKey:kCITYKey]; self.COMMUNITYID = [decoder decodeObjectForKey:kCOMMUNITYIDKey]; self.CITYNAME = [decoder decodeObjectForKey:kCITYNAMEKey]; self.BUILDINGNUM = [decoder decodeObjectForKey:kBUILDINGNUMKey]; self.NICKNAME = [decoder decodeObjectForKey:kNICKNAMEKey]; self.HOUSENUM = [decoder decodeObjectForKey:kHOUSENUMKey]; } return self; } @end
写完之后发现整个人都不好了,如果对象属性更多,这些重复性的代码也意味着要被Command+C Command+V着N次,累觉无爱。
然后尝试用其他方式进行,既然Objective-C运行时库提供了非常便利的方法获取其对象运行时所属类及其所有成员变量,并通过KVC进行值的存取,那么或者可以这样objc/runtime+KVC
导入#import <objc/runtime.h>头文件
//获取类中所有属性 unsigned int count; Ivar *varA = class_copyIvarList([MyModel class], &count); for (unsigned int i=0; i<count; i++) { Ivar v = varA[i]; const char *name = ivar_getName(v); NSLog(@"%s==",name); }
好用,继续,利用KVC进行取值,根据属性名称获取对应的值
//KVC取值 id value = [self valueForKey:strName]; [encoder encodeObject:value forKey:strName];
最终改后的程序:
#import "MyModel.h" #import <objc/runtime.h> @implementation MyModel //解档 - (id)initWithCoder:(NSCoder *)decoder { if (self = [super init]) { unsigned int count = 0; //获取类中所有成员变量名 Ivar *ivar = class_copyIvarList([MyModel class], &count); for (int i = 0; i<count; i++) { Ivar iva = ivar[i]; const char *name = ivar_getName(iva); NSString *strName = [NSString stringWithUTF8String:name]; //进行解档取值 id value = [decoder decodeObjectForKey:strName]; //利用KVC对属性赋值 [self setValue:value forKey:strName]; } free(ivar); } return self; } //归档 - (void)encodeWithCoder:(NSCoder *)encoder { unsigned int count; Ivar *ivar = class_copyIvarList([MyModel class], &count); for (int i=0; i<count; i++) { Ivar iv = ivar[i]; const char *name = ivar_getName(iv); NSString *strName = [NSString stringWithUTF8String:name]; //利用KVC取值 id value = [self valueForKey:strName]; [encoder encodeObject:value forKey:strName]; } free(ivar); } @end
原帖:http://www.daxueit.com/article/6126.html
相关文章推荐
- IOS 成员变量,全局变量,局部变量定义,static与extern的区别
- iOS自定义相机界面(实现自定义裁剪框)
- iOS开发-AFNetworking
- iOS项目模仿之喜马拉雅(三)—— 分段选择器实现
- iOS Mantle解析框架简单的使用入门(字典映射model)
- iOS中copy和mutableCopy
- iOS-BLE蓝牙开发持续更新
- IOS学习之蓝牙4.0
- iOS开发中本地几种存储方式
- ios开发——日常之iOS系统控件高度
- iOS中选择相册照片添加到应用程序中
- [iOS]监控屏幕旋转
- iOS 9 学习系列: Xcode Code Coverage
- iOS开发自动布局第三方Snapkit
- iOS开发多线程篇—GCD的常见用法
- iOS开发中控制屏幕旋转,个别界面强制横屏
- iOS-MultipeerConnectivity框架开发(二)(优化中。。。)
- iOS----------SDWebimage源码解析(1)
- iOS判断邮箱,手机号码,车牌号是否合法
- iOS游戏控制手柄