IOS利用objc/runtime和KVC——快速归档解档

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

开发过程中有时需要存储一些轻量级的数据,对于IOS提供的几种数据存储方式在这时最合适当属对象归档:NSCoding

但是将对象数据进行归档解档时候需要实现两个方法: encodeWithCoder和initWithEncoder。encodeWithCoder就是编码,initWithCoder就是解码。

encodeWithCoder方法传入的是一个NSCoder对象,实现的时候我们就可以调用encodeObject、encodeFloat、 encodeInt等各种方法并通过指定键值进行编码,而

在需要的时候调用decodeDoubleForKey,decodeFloatForKey,decodeObjectForKey进行解码。

1.实现encodeWithCoder和initWithEncoder

#import"MyModel.h"@implementationMyModel#definekCUSTIDKey @"CUSTIDKey"#definekCUSTSTATUSKey @"CUSTSTATUSKey"#definekPICTUREIDKey @"PICTUREIDKey"#definekUNITNUMKey @"UNITNUMKey"#definekCITYIDKey @"CITYIDKey"#definekCUSTNAMEKey @"CUSTNAMEKey"#definekCOMMUNITYNAMEKey @"COMMUNITYNAMEKey"#definekRESERVE1Key @"RESERVE1Key"#definekCITYKey @"CITYKey"#definekCOMMUNITYIDKey @"COMMUNITYIDKey"#definekCITYNAMEKey @"CITYNAMEKey"#definekBUILDINGNUMKey @"BUILDINGNUMKey"#definekNICKNAMEKey @"NICKNAMEKey"#definekHOUSENUMKey @"HOUSENUMKey"#definekPHONEKey @"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];

}returnself;

}@end

写完之后发现整个人都不好了,如果对象属性更多,这些重复性的代码也意味着要被Command+C Command+V着N次,累觉无爱。

然后尝试用其他方式进行,既然Objective-C运行时库提供了非常便利的方法获取其对象运行时所属类及其所有成员变量,并通过KVC进行值的存取,那么或者可以这样objc/runtime+KVC

导入#import <objc/runtime.h>头文件

//获取类中所有属性unsignedintcount;

Ivar*varA = class_copyIvarList([MyModelclass], &count);for(unsignedinti=0; i<count; i++) {

Ivar v=varA[i];constchar*name =ivar_getName(v);

NSLog(@"%s==",name);

}

打印LOG:

好用,继续,利用KVC进行取值,根据属性名称获取对应的值

//KVC取值idvalue =[self valueForKey:strName];

[encoder encodeObject:value forKey:strName];

最终改后的程序:

#import"MyModel.h"#import<objc/runtime.h>@implementationMyModel//解档- (id)initWithCoder:(NSCoder *)decoder

{if(self =[super init]) {

unsignedintcount =0;//获取类中所有成员变量名Ivar *ivar = class_copyIvarList([MyModelclass], &count);for(inti =0; i<count; i++) {

Ivar iva=ivar[i];constchar*name =ivar_getName(iva);

NSString*strName =[NSString stringWithUTF8String:name];//进行解档取值idvalue =[decoder decodeObjectForKey:strName];//利用KVC对属性赋值[self setValue:value forKey:strName];

}

free(ivar);

}returnself;

}//归档- (void)encodeWithCoder:(NSCoder *)encoder

{

unsignedintcount;

Ivar*ivar = class_copyIvarList([MyModelclass], &count);for(inti=0; i<count; i++) {

Ivar iv=ivar[i];constchar*name =ivar_getName(iv);

NSString*strName =[NSString stringWithUTF8String:name];//利用KVC取值idvalue =[self valueForKey:strName];

[encoder encodeObject:value forKey:strName];

}

free(ivar);

}@end

妥妥的了,远离重复,做开心玩耍的程序媛!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航