Objective-C基础教程十

时间:2022-09-07 08:30:02

许多人将键/值编码亲切地成为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反射类似,运行速度较慢。