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 :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:将会被传递给容器中的每一个对象,而不是容器本身进行操作。结果会被添加进返回的容器中,这样,开发者可以很方便的操作集合来返回另一个集合。

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    朽木自雕也阅读 1,597评论 6 1
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    黑暗中的孤影阅读 50,026评论 74 441
  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    Fendouzhe阅读 690评论 0 6
  • KVC简单介绍 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key...
    公子无礼阅读 1,437评论 0 6
  • 简介 KVC(Key-value coding)键值编码,翻译一下就是指iOS的开发中,可以允许开发者通过Key名...
    6ffd6634d577阅读 1,341评论 1 9