OC KVC


KVC 全称 key valued coding 键值编码

在说KVC之前应该简单的了解一下反射机制

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法.
对于任意一个对象,都能够调用它的任意一个方法和属性.
JAVA,C#都有这个机制.
ObjC也有,所以你根部不必进行任何操作就可以进行属性的动态读写,那就是KVC.
KVC的操作方法由NSKeyValueCoding提供,而他是NSObject的类别,也就是说ObjC中几乎所有的对象都支持KVC操作.

常用方法

获取值的方法

  • valueForKey:,传入NSString属性的名字.
  • valueForKeyPath:,传入NSString属性的路径.xx.xx形式.
  • valueForUndefinedKey:,它的默认实现是抛出异常,可以重写这个函数做错误处理.

修改值的方法

  • setValue:forKey:
  • setValue:forKeyPath:
  • setValue:forUndefinedKey:

setValue:forKey的搜索过程:

  1. 首先搜索的是@property自动生成的setter方法.格式为(set).
  2. 如果没有搜索到将会搜索程序员手写的setter方法.手写setter的方法原因可能是@synthsize的使用;也可能是没有使用@property自动合成属性,只是声明了成员变量然后手写setter.
  3. 当没有找到任何setter的方法之后,如果类方法accessInstanceVariablesDirectly返回YES(注:这是NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)那么按_,_is,,is的顺序搜索成员名.
  4. 如果还是没有找到设置成员的值,就会调用setValue:forUndefinedKey:.
  5. 如果没有重写setValue:forUndefinedKey程序会马上崩溃.

注意

1、使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换.
2、KVC可以访问成员变量,无论是否提供getter/setter方法,无论可见性是怎样,是否有readonly修饰.

KVC主要应用

setValue:forUndefinedKey与valueForUndefinedKey的应用

KVC的主要用途是将dictionary转换成model,但有些服务器返回的字段有可能是oc的关键字比如 ‘id’ , ’description’等.我们无法让@property后面key值为id,于是使用大写的ID代替,KVC是区分大小写的我们不用担心。这时我们只需在setValue:forUndefinedKey:把id的key值赋值给ID的key值,就可以避免关键字的尴尬。

dict<->model互转

字典转模型
[self setValuesForKeysWithDictionary:dict];
模型转字典
[p dictionaryWithValuesForKeys:array];

KVC集合

NSArray/NSSet等都支持KVC.
[array valueForKeyPath:@"dog.name"];

使用KVC计算属性

格式为:[p valueForKeyPath:@"Left keypath部分.@Collectionoperator部分.Right keypath部分”];
Left keypath部分:需要操作对象路径。
Collectionoperator部分:通过@符号确定使用的集合操作
Right keypath部分:需要进行集合操作的属性。
举例:[p valueForKeyPath:@"books.@sum.price"];
@avg:平均值
@count:总数
@max:最大
@min:最小
@sum:总数

OC KVC的更多相关文章

  1. OC KVC总结

    在iOS开发中,我们一般使用set方法或者点语法来修改对象的属性值,比如说 stu.age = 9 与 [stu setAge:9]. KVC(key value coding)键值编码,这是一种间接 ...

  2. oc kvc的模式:匹配搜索模式(模式匹配)、装包解包

    按照一定规则使用匹配模式在目标空间进行搜索,然后执行相应操作: 运行时系统将kvc的运行机制解释为模式匹配,将值的兼容性问题解释为装包解包问题 一.模式匹配 The default implement ...

  3. iOS 头条一面 面试题

    1.如何高效的切圆角? 切圆角共有以下三种方案: cornerRadius + masksToBounds:适用于单个视图或视图不在列表上且量级较小的情况,会导致离屏渲染. CAShapeLayer+ ...

  4. OC:属性、点语法、KVC

    //属性的属性 属性定义在一个 .h文件里,在这个.h文件里可以定义实例变量(就是这个类的特征),也可以通过   @protery(属性约束关键字) 属性名字类型 属性名 来定义一些属性,在prope ...

  5. KVC 和 OC字典

    KVC(键值编码)和OC 字典很相似,都是键值存储.但是OC 字典比较灵活,它是一种映射. [dict setObject:<#(id)#> forKey:<#(id<NSCo ...

  6. QF——OC中的KVC,KVO

    KVC: (Key Value Coding) 键值编码 所谓KVC,其实就是不通过set和get方法访问对象属性,而是通过属性名字符串动态的去读取属性.KVC其实也是OC反射机制的一种运用. 之所以 ...

  7. 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

    学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...

  8. OC学习篇之---KVC和KVO操作

    前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一 ...

  9. [转] iOS (OC) 中 KVC 与 KVO 理解

    转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...

随机推荐

  1. IOS开发之TabBarItem&NavigationBarItem

    想必大家都用过微信,微信间的页面切换是如何做成的呢?接下来我们用storyboard结合着代码来模拟一下微信的视图控制模式. "工欲善其事,必先利其器",下面主要是对storybo ...

  2. Objective-C中的Block回调模式

    在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...

  3. 分享一个 @user 前端插件

    开源地址:https://github.com/yuezhongxin/Mention.js 插件效果:类似于微博或 github 中 @user 列表效果. 这是个二次开发的插件,花了几天时间,对 ...

  4. 相克军_Oracle体系_随堂笔记005-Database buffer cache

    本章主要阐述SGA中的Database buffer cache. Buffer cache { 1.pin (读写瞬间的状态) 2.clean 3.dirty 4.unused } --Databa ...

  5. DIB位图(Bitmap)的读取和保存

    设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...

  6. do{...}while(0)的妙用

    在学习第一门编程语言时,就已经介绍了顺序分支.条件分支.循环分支.比如循环分支有for.while.do-while语句.在随后的学校及工作中,如果手工循环一般使用for.while,很少使用do-w ...

  7. scikit-learn一般实例之三:连接多个特征提取方法

    在很多现实世界的例子中,有很多从数据集中提取特征的方法.很多时候我们需要结合多种方法获得好的效果.本例将展示怎样使用FeatureUnion通过主成分分析和单变量选择相进行特征结合. 结合使用转换器的 ...

  8. webpack+vue-cli项目打包技巧

    1.设置config文件夹index.js中productionSourceMap的值为false,也就是设置webpack配置中devtool为false,打包后文件体积可以减少百分之八十!!!!! ...

  9. Ubuntu实现树莓派交叉编译

    一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征:有时 ...

  10. 【原创】Kafka console consumer源代码分析(一)

    上一篇中分析了Scala版的console producer代码,这篇文章为读者带来一篇console consumer工作原理分析的随笔.其实不论是哪个consumer,大部分的工作原理都是类似的. ...