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. 【开源】OSharp框架解说系列(4):架构分层及IoC

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  2. 苹果系统安装虚拟机 Mac如何安装虚拟机教程

    1.前言    大家在用 Mac 系统的时候,可能有时难免还是要用到 Windows 系统.在 Mac 上使用 Windows 系统有二种方法.一种是在 Mac上安装双系统,适合要在机器上处理一些大型 ...

  3. 介绍一个很爽的 php 字符串特定检索函数---strpos()

    大家在用 php 开发的时候 是否 有遇到过,对于一个获取的字符串,如果想要特定检测它是否 含有某个特定的字符或者子字符串,总是找不到好方法,或者根本做不到,迫于无奈而使用foreach. 函数: s ...

  4. 如何添加并设置远程桌面(RD)授权服务器

    上一篇日志中介绍了如何将现成的远程桌面授权服务器添加到对应的远程桌面回话主机中. 本篇日志将引导您如何添加配置相应的远程桌面授权服务器,这样就可以根据所购买的授权类型和授权级别添加需要甚至" ...

  5. C语言 编程练习22题

    一.题目 1.编一个程序,输入x的值,按下列公式计算并输出y值: 2.已知数A与B,由键盘输入AB的值,交换它们的值,并输出. 3.给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位 ...

  6. 浅析JS中的模块规范(CommonJS,AMD,CMD)

    如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯,我也听过,但之前也真的是听听而已. 现在就看看吧,这些规范到底是啥东西,干嘛的. 一.CommonJS ...

  7. MySQL4.0命令操作学习笔记

    声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...

  8. ThinkPHP学习(一)

    下载3.2框架后,解压缩到web目录下面,可以看到初始的目录结构如下: 3.2版本相比之前的版本自带了一个完整的应用目录结构和默认的应用入口文件,开发人员可以在这个基 础之上灵活调整.其中, Appl ...

  9. Java进击C#——语法之基础

    本章简言 上一章讲到关于项目工程开发常用的知识点,有了前面俩章的介绍之后.本章正式开始介绍关于C#的基础语法.我们都很清楚C#也是面向对象的计算机语言.而且他跟JAVA的相似度高达80%.所以很多语法 ...

  10. TeamCity : 配置第一个工程

    前面我们已经创建了TeamCity Server 和一个 Agent,接下来我们为一个.net core 控制台程序配置自动化的编译. 创建 .net core 项目 我们在本地创建一个简单的 .ne ...