第十六章键/值编码
在这一章来学习Cocoa提供的另一种间接机制,这种机制不属于Objective-C语言的特性,是一种不同于面向对象编程间接机制的间接机制
这种间接机制包括:直接调用对象的方法、属性的点表示法或设置实例变量来直接更改对象状态
键/值编码(KVC),间接更改对象状态的方式,实现方法是使用字符串
描述要更改的对象状态部分
二、KVC简介
键/值编码中的基本方法包括-valueForKey:和-setValue:forKey:,以字符串的形式向对象发送消息
valueForKey:首先查找以键-key或-isKey命名的getter方法
如果不存在getter方法,它将在对象内部查找名为_key或key的实例变量
如果没有通过@synthesize提供存取方法,valueForKey将会查找实例变量{_字符串值}和{字符串
值}。这一点非常重要-valueForKey在Objective-C运行时使用元数据打开对象并进入其中查找需
要的信息,在C和C++中不能执行这种操作,通过KVC可以获取不存在getter方法的对象值,无需
通过对象指针直接访问实例变量
setValueForKey:使用它时它自动将标量值(int、float、struct)放入NSNumber或NSValue中
它也能自动将标量从这些对象中取出,KVC具有自动包装功能,常规方法调
用和属性语法不具备
Tip:水果公司以下划线开头的实行保存实例变量,请不要在其他地方使用下划线开头
三、路径
键/值编码还支持指定键路径
-valueForKeyPath和-setValueForKeyPath方法访问键路径
键路径深度是任意的,其形态更像是xml中调用子节点
四、整体操作
在KVC中向NSArray请求一个键值,它它实际上会查询数组中每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。这种方法也适用于通过键路径访问的对象内部的数组
valueForKeyPath:将路径分解并从做向右进行处理
不能再键路径中为这些数组添加索引
键/路径还可以引用运算符进行运算,例如获取一组值的平均值或返回这组值的最小值和最大值
举例代码:
但如果不更改内容,可将其视为NSArray)
@count,其中的@符号意味着后面进行一些运算
在这一章来学习Cocoa提供的另一种间接机制,这种机制不属于Objective-C语言的特性,是一种不同于面向对象编程间接机制的间接机制
这种间接机制包括:直接调用对象的方法、属性的点表示法或设置实例变量来直接更改对象状态
键/值编码(KVC),间接更改对象状态的方式,实现方法是使用字符串
描述要更改的对象状态部分
二、KVC简介
键/值编码中的基本方法包括-valueForKey:和-setValue:forKey:,以字符串的形式向对象发送消息
valueForKey:首先查找以键-key或-isKey命名的getter方法
如果不存在getter方法,它将在对象内部查找名为_key或key的实例变量
如果没有通过@synthesize提供存取方法,valueForKey将会查找实例变量{_字符串值}和{字符串
值}。这一点非常重要-valueForKey在Objective-C运行时使用元数据打开对象并进入其中查找需
要的信息,在C和C++中不能执行这种操作,通过KVC可以获取不存在getter方法的对象值,无需
通过对象指针直接访问实例变量
setValueForKey:使用它时它自动将标量值(int、float、struct)放入NSNumber或NSValue中
它也能自动将标量从这些对象中取出,KVC具有自动包装功能,常规方法调
用和属性语法不具备
Tip:水果公司以下划线开头的实行保存实例变量,请不要在其他地方使用下划线开头
三、路径
键/值编码还支持指定键路径
-valueForKeyPath和-setValueForKeyPath方法访问键路径
键路径深度是任意的,其形态更像是xml中调用子节点
四、整体操作
在KVC中向NSArray请求一个键值,它它实际上会查询数组中每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。这种方法也适用于通过键路径访问的对象内部的数组
valueForKeyPath:将路径分解并从做向右进行处理
不能再键路径中为这些数组添加索引
键/路径还可以引用运算符进行运算,例如获取一组值的平均值或返回这组值的最小值和最大值
举例代码:
NSNumber *count;
count = [garage valueForKeyPath: @"cars.@count"];
NSLog (@"We have %@ cars", count);
cars.@count 之中:cars用于获取cars属性,他是来自garage的NSArray类型的值(其实他是NSMutableArray,但如果不更改内容,可将其视为NSArray)
@count,其中的@符号意味着后面进行一些运算