一  KVC的基本概念

1、KVC是Key Value Coding的缩写,意思是键值编码。

在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过getter/setter方法来访问对象的属性。

用KVC可以间接访问对象属性的机制。通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法。

二  常用方法及特性

1、KVC的常用方法
 
  <1>根据key的值读取对象的属性
  - (id)valueForKey:(NSString *)key; 
 
  <2>根据key的值来写对象的属性
  - (void)setValue:(id)value forKey:(NSString *)key; 
 
  <3>当对非类对象属性设置nil时,调用,默认抛出异常
  setNilValueForKey: 
 
  <4>错误拦截,当key的值是没有定义的,这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来
  valueForUndefinedKey:

KVC 最常用的还是在序列化和反序列话对象。尤其是在json 转模型的时候,KVC让程序员摆脱了繁琐无营养的代码堆积,减少代码量就是减少出错的概率。

2、使用 KVC 为对象赋值或者取值时,需要知道准确的键值, 相比较点语法,KVC 是一种间接的传递方式,这种方式有利于对象解耦,让对象彼此之间的耦合度不会太高。

KVC 不但能够赋值,而且还能破坏只读的特性。OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力,这样做就会破坏类的封装性. 类的私有属性和只读属性都可以通过KVC去访问.

当然这只是我们需要注意的一个细节,更重要的是KVC 有自动装箱(自动类型转换)的功能,我们不需要去转换类型了。

3、支持键值路径

 
(1)什么叫支持键值路径?键值路径是对于一个类中有数组对象的属性进行便捷操作
 
(2)说白了就是支持嵌套。因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去(KVC在按照键值路径取值时,会自动层层深入,获取对应的键值)

4、支持操作符

 
(1)假如我们有10个字符串,我们想求出这10个字符串的总长度,我们可以使用KVC提供的操作符。

(2)NSArray *books=@[@"鸟哥烧烤私房菜",@"程序员摊煎饼宝典",@"麻辣烫基础教程"];
  NSLog(@"%@",[books valueForKeyPath:@"@sum.length"]);
  这里的@sum 是KVC 提供的,不是我们写的。像这样的函数共有5个@avg,@count,@max,@min,@sum。我们直接用就可以了

5、KVC的缺点:
 
(1)一旦使用 KVC 你的编译器无法检查出错误,即不会对设置的键、键路径进行错误检查;
 
(2)并且执行效率要低于合成存取器方法和自定的 setter 和 getter 方法。因为使用 KVC 键值编码,它必须先解析字符串,然后在设置或者访问对象的实例变量。所以只有当你非常需要它提供的可扩展性时才使用它。
 
 
 
三 、 KVC机制通过key找到value的原理
 
1、当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过下面几种不同的方式解析这个调用:
 
  首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException 异常错误。
 
2、补充:KVC查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方 法, 前面加一个get,或者_someKey以_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找 _someKey这个变量是否存在。
 
3、设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求(不崩)。
 
4、setValuesForKeysWithDictionary方法也是调用setValueForKey方法

iOS开发之KVC全解的更多相关文章

  1. IOS开发之UINavigationController详解

    UINavigationController是IOS编程中比较常用的一种容器view controller,很多系统的控件(如UIImagePickerViewController)以及很多有名的AP ...

  2. ios开发之 NSObject详解

    NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Obje ...

  3. iOS开发之---KVC全解

    ————————————————————————————————————————————————————————————— 一 KVC的基本概念 KVC是Key Value Coding的缩写,意思是 ...

  4. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  5. IOS开发之KVC与KVO简述

    KVC:Key-Value Coding KVO:Key-Value Observing Person.m #import <Foundation/Foundation.h> @inter ...

  6. iOS开发之Quartz2D详解

    1. 什么是Quartz2D? Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片( ...

  7. iOS开发之SDWebImage详解

    介绍 github地址: https://github.com/rs/SDWebImage 简介 一个异步图片下载及缓存的库 特性: 一个扩展UIImageView分类的库,支持加载网络图片并缓存图片 ...

  8. iOS开发之KVC

    1.KVC概述 KVC(Key-value coding)是一套利用字符串标识符间接访问对象属性和关系的机制.Cocoa Programming中,Core Data,Application Scri ...

  9. iOS开发之zip文件解压

    今天给大家分享zip解压到指定目录 首先需要下载ZipArchive文件 下载地址:https://pan.baidu.com/s/1S6qYicoVr3M3hI0M1EW2Bw 将下载的文件导入工程 ...

随机推荐

  1. Python三方库xlrd,xlwd-Excel读写

    恩,我是翻译汪,主要内容来自http://www.python-excel.org/ 在xlrd,xlwt这两个库中,Excel的结构表示为workbook整个Excel对象,sheet工作表,row ...

  2. 微信小程序video监测播放进度

    video组件提供的进度相关的监测只有 bindtimeupdate ,官方说明这个函数250ms触发一次,在开发者工具上基本符合,但在真机上每隔1秒触发一次.达不到我们要求的精度.对比下音频,wx. ...

  3. C#当中的out关键字(借鉴于CSDN)

    一丶与ref关键字一样,out关键字也是按引用来传递的.out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数 ...

  4. Vue(八)全局变量和全局方法

    一.在main.js同级目录建立一个common.js文件 // 全局变量 const globalObj = {}; // 定义公共变量 globalObj.name = '小明'; // 定义公共 ...

  5. java中关于数组的初始化

  6. Nginx反向代理WebSocket(WSS)

    1. WebSocket协议 WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法.作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程序的难 ...

  7. JS练习:切换图片

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  8. 6 DataFrame处理丢失数据--数据清洗

    处理丢失数据       有两种丢失数据:                  · None         · np.nan(NaN)     1 None     None是Python自带的,其类 ...

  9. 实验十二 团队作业8:软件测试与Alpha冲刺 第三天

    项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 作业链接地址 团队名称 always run 作业学习目标 (1)掌握软件测试基础技术.(2)学习迭代式增量软件开发过程(Scrum) ...

  10. Caffe 工程的一些编译错误以及解决方案

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51371936 整理一下最近遇到caff ...