KVC分析

KVC是什么?

kvc 是key value coding 的缩写,在ios中用于通过key,来获取value,即绕过setter和getter方法,根据key来得到想要获取的属性,是ios基于isa-swizzing的一种实现.

KVC用法

获取value

a>. valueForKey:传入NSString属性的名字。

b>. valueForKeyPath:属性的路径,xx.xx

c>. valueForUndefinedKey 默认实现是抛出异常,可重写这个函数做错误处理

修改value

a>. setValue:forKey:

b>. setValue:forKeyPath:

c>. setValue:forUnderfinedKey:

d>. setNilValueForKey:对非类对象属性设置nil时调用,默认抛出异常。

KVC分析_第1张图片

KVC :value查找策略

set查找:

1>首先查找setter:方法。setKey

2>setter方法没有找到,如果类方法accessInstanceVariablesDirectly返回YES,查找变量,按 _key,_isKey,key,iskey的顺序搜索成员名。

3>如果没有找到成员变量,调用setValue:forUnderfinedKey: 上报异常

get查找

1>查找getter方法,找到直接调用。如果是BOOL、int等内建值类型,会做NSNumber的转换。

2>getter没找到,如果类方法accessInstanceVariablesDirectly返回YES,那么按 _key,_isKey,key,iskey的顺序搜索成员名。

3>再没找到,调用valueForUndefinedKey。

KVC的意义

1>动态的取值和改值,利用KVC动态的取值和设值是最基本的用途了,可以绕过私有变量的限制,对私有变量进行获取和修改,前提是要知道变量名,从而可以改变一些控件没有对外开放的内部属性

2>Model和字典转换,最典型的一个应用便是Json to Model,后面有时间带大家实现一个json to model的库

3>操作集合,Apple对KVC的valueForKey:方法作了一些特殊的实现,比如说NSArray和NSSet这样的容器类就实现了这些方法。所以可以用KVC很方便地操作集合

4>用KVC实现高阶消息传递

当对容器类使用KVC时,valueForKey:将会被传递给容器中的每一个对象,而不是容器本身进行操作。结果会被添加进返回的容器中,这样,开发者可以很方便的操作集合来返回另一个集合。

KVC分析_第2张图片

方法uppercaseString被传递到NSArray中的每一项,这样,NSArray的每一员都会执行uppercaseString并返回一个包含结果的新的NSArray。从打印结果可以看出,所有String都成功以转成了大写。

同样如果要执行多个方法也可以用valueForKeyPath:方法。它先会对每一个成员调用uppercaseString方法,然后再调用length,因为lenth方法返回是一个数字,所以返回结果以NSNumber的形式保存在新数组里。同理,其他可识别的方法,亦有效

下篇聊聊KVO,不管怎么样,KVO基于KVC,这是一个神奇的特性.

你可能感兴趣的:(KVC分析)