Objective-C 键/值编码

第十六章:键/值编码

键/值编码(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:设置未知键的值 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值