许多人将键/值编码亲切地成为KVC,它是一种间接更改对象状态的方式,其实现方法是使用字符串描述要更改的对象状态部分。
基本调用包括-valueForKey:和-setValue:forKey:。以字符串的形式向对象发送消息,这个字符串是我们关注的属性的关键。
因此,我们可以请求car的名称:
NSString *name = [car valueForKey: @"name"]);
valueForKey: 首先查找以键-key或isKey命名的getter方法。如果不存在getter方法,它将在对象内部查找名为_key或key的实例变量。
同理,setValue:forKey先查找setter方法,然后是同名的实例变量。
上面的方法很是类似于java的反射,详情可参加:http://blog.csdn.net/pipisky2006/article/details/7285268
路径
除了通过键设置值外,键/值编码还支持指定键路径,像文件系统路径一样,你可以遵循一系列关系来指定该路径。
例如,car对象中有个engine属性,engine有个horsepower属性。可以执行以下调用
[car setValue:[NSNumber numberWithInt: 155] forKeyPath: @"engine.horsepower"];
[car valueForKeyePath: @"engine,horsepower"]);
这些关键路径的深度是任意的,比如,可以使用诸如“car.interior.aircodnitioner.fan.velocity”这样的的键路径。
一对多的关系
Car具有一个轮胎数组,在这种情况下获得的是一个数组
NSArray *pressures = [car valueForKeyPath: @"tires.pressure"];
键路径不仅能引用对象值,还可以引用一些运算符来进行一些运算。例如获取一组值的平静值或返回这组值的最大值。
NSNumber *count;
count = [garage valueForKeyPath: @"cars.@count"];//@count为运算符,还有像@sum,@avg,
要注意,KVC和java反射类似,运行速度较慢。