原文链接:obj-c编程16:键值编码(KVC)
我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存取器方法来获取或设置类的属性。下面的例子,借助于KVC的功能读取和设置了类Son实例的属性i:
1#import<Foundation/Foundation.h>23#definemsg(...) NSLog(__VA_ARGS__)4#definemki(x) [NSNumber numberWithInt:x]56@interfaceSon:NSObject{7NSArray *ary;8NSNumber *i;9}10@PRoperty NSArray *ary;11@property NSNumber *i;12@end1314@implementationSon15@synthesizeary,i;1617-(id)init{18return[self init:0];19}2021-(id)init:(int)i_v{22self =[super init];23if(self){24ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\25mki(100),nil];26i =[NSNumber numberWithInt:i_v];27}28returnself;29}30@end3132intmain(intargc,char*argv[])33{34@autoreleasepool{35Son *son =[[Son alloc] init];36[son setValue:mki(1001) forKey:@"i"];37msg(@"%@",[son valueForKey:@"i"]);38msg(@"%@",[son valueForKeyPath:@"ary.@count"]);
运行结果如下:
apple@kissAir: objc_src$clang -fobjc-arc -framework Foundation k.m -o k
apple@kissAir: objc_src$./k2014-07-0615:51:56.098k[1386:507]1001
KVC其中有KeyPath的概念,比如类Baba中有一个属性名为son,其是Son的对象;而类Son中也有属性NSString name,这时我们可以使用KeyPath的语法,像遍历树一样找到最终的属性name:
[baba valueForKeyPath:@"son.name"];
[baba setValue:@"tom" forKeyPath:@"son.name"];
除了遍历对象关系以外,我们还可以访问一些操作对象集合的函数,比如求平均数等等:
下面实际看一个例子
1#import<Foundation/Foundation.h>23#definemsg(...) NSLog(__VA_ARGS__)4#definemki(x) [NSNumber numberWithInt:x]56@interfaceSon:NSObject{7NSArray *ary;8NSNumber *i;9}10@property NSArray *ary;11@property NSNumber *i;12@end1314@implementationSon15@synthesizeary,i;1617-(id)init{18return[self init:0];19}2021-(id)init:(int)i_v{22self =[super init];23if(self){24ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\25mki(100),nil];26i =[NSNumber numberWithInt:i_v];27}28returnself;29}30@end3132intmain(intargc,char*argv[])33{34@autoreleasepool{35Son *son =[[Son alloc] init];36[son setValue:mki(1001) forKey:@"i"];37msg(@"%@",[son valueForKey:@"i"]);38msg(@"%@",[son valueForKeyPath:@"ary.@count"]);3940Son *son0 = [[Son alloc] init:11];41Son *son1 = [[Son alloc] init:200];42Son *son2 = [[Son alloc] init:25];4344NSArray *ary =[NSArray arrayWithObjects:son,son0,son1,son2,nil];45msg(@"avg:%@",[ary valueForKeyPath:@"@avg.i"]);46msg(@"sum:%@",[ary valueForKeyPath:@"@sum.i"]);4748}49return0;50}
运行结果如下:
apple@kissAir: objc_src$./k2014-07-0615:51:56.098k[1386:507]10012014-07-0615:51:56.100k[1386:507]42014-07-0615:51:56.100k[1386:507] avg:309.252014-07-0615:51:56.101k[1386:507]sum:1237