第十六章:键/值编码
键/值编码(KVC)是Cocoa提供的一种间接更改对象状态的方式,实现方式是使用字符串描述要更改的对象状态部分
16.1 入门项目
16.2 KVC简介
键/值编码的基本调用包括:-valueForKey:和-setValue:forKey:
以字符串形式向对象发送消息,字符串即属性名
valueForKey:的查找顺序:先查-key或-iskey命名的setter方法,如果不存在,则查对象内部_key或key的实例变量.重要的是:-valueForKey在OC运行时中使用元数据打开对象并进入其中查找信息,通过KVC可以获取不存在getter方法的对象值,而无需通过指针直接访问实例变量
同时,对于KVC,Cocoa自动放入和取出标量值,仅KVC具有这种自动包装功能,常规方法调用和属性语法不具备该功能
setValue:forKey:同valueForKey查找顺序相同,不过如果设置一个标量值,则需要将其包装起来
16.3 路径
除了键/值设置值外,还可以通过路径设置值
使用点(.)分隔不同属性的名称,如:car.engine.horsepower
16.4 整体操作
对于NSArray,通过KVC向NSArray请求一个键值,他会查找NSArray中每一个对象,并将结果返回为另一个数组,这种情况也适用于对象内部数组,如:car.tires
可以用car.tires.pressure获得轮胎压力的数组,但是不能添加索引,如car.tires[0].pressure
16.4.1 中途小憩
16.4.2 流畅的运算
KVC的下一个好处是,可以利用一些操作符来对查询结果进行运算
@count计算左侧的结果,用于计数
@sum计算总和,如:@"cars.@sum.mileage" @sum将结果拆成两部分
@agv计算平均值,如:@"cars.@avg.mileage"
@min取最小值
@max取最大值
注意:KVC不是免费的,KVC通过解析字符串计算,速度比较慢,且编译器无法对它进行错误检查
@distinctUnionOfObjects取不重复的值
不能添加自己的KVC运算符
16.5 批处理
dictionaryWithValuesForKeys:接受字符串数组,获取一些键,对每个键调用valueForKey:并为键字符串和获得的值构建一个字典
setValuesForKeysWithDictionary:按照字典为对象赋值,控制用[NSNull null]
16.6 nil仍然可用
nil对于标量值无法有确定的意义
可以重写setNilValueForKey,提供逻辑上有意义的任何值,注意,如果不是指定键,则调用父类的setNilValueForKey
16.7 处理未定义的键
重写valueOfUndefinedKey:方法,来处理未定义的键
用setValue:forUndefinedKey:设置未知键的值