KVC:即Key Value Coding :间接通过字符串类型的属性字段key取出该属性的值
作用:1.可以通过valueForKey或者valueForKeyPath访问对象所有成员变量属性的值(包含@private)
2.可以通过[setValue:forKey:]或者[setValue:forKeyPath:]间接修改私有成员变量的值
实例:
- (void)viewDidLoad {
[super viewDidLoad];
//KVC :key value coding 间接通过字符串类型的属性字段key取出该属性的值
//KVC的价值:
//1.可以访问私有成员变量的值
//2.可以间接修改私有成员变量的值
Persion *p = [[Persion alloc]init];
p.age = 20;
//取公有值
id age = [p valueForKey:@"age"];
//取得私有的值(height为Persion的@private)
id height = [p valueForKey:@"height"];
NSLog(@"age = %d, height = %f",[age intValue],[height floatValue]);
//输出结果:2014-12-08 15:48:02.611 KVC[83711:3714658] age = 20, height = 0.000000
//修改私有的值
[p setValue:@(1.2) forKey:@"height"];
NSLog(@"修改后的height=%f",[[p valueForKey:@"height"] floatValue]);
//输出结果:2014-12-08 15:48:02.612 KVC[83711:3714658] 修改后的height=1.200000
//dog为p的属性,类型为Dog,dog中有name和weight属性
p.dog = [[Dog alloc]init];
p.dog.name = @"hah";
//利用kvc取得p的dog属性的name的值
[p valueForKeyPath:@"dog.name"];
//小结:
// 1.valueForKey只能访问对象的属性
// 2.valueForKeyPath能通过.语法,一层一层的访问内部属性
Dog *d1 = [[Dog alloc]init];
d1.name = @"D1";
d1.weight = 20.2;
Dog *d2 = [[Dog alloc]init];
d2.name = @"D2";
d2.weight = 30.2;
Dog *d3 = [[Dog alloc]init];
d3.name = @"D3";
d3.weight = 40.2;
p.dogs = @[d1,d2,d3];
//dogs为p的属性,这个人拥有多少只狗,类型为NSArray
//用kvc取出这个人拥有的狗的个数
int count = [[p valueForKeyPath:@"dogs.@count"] intValue];//NSArray为系统的类,则需要加上@符号
NSLog(@"count = %d",count);
//输出结果:2014-12-08 15:48:02.612 KVC[83711:3714658] count = 3
//用kvc方式计算这个人所拥有狗的总总量
double subweight = [[p valueForKeyPath:@"dogs.@sum.weight"] doubleValue];//调用系统函数则需要在属性前加上@函数名.
NSLog(@"subweight = %f",subweight);
//输出结果:2014-12-08 15:48:02.612 KVC[83711:3714658] subweight = 90.600000
}