iOS开发之---KVC全解
—————————————————————————————————————————————————————————————
一 KVC的基本概念
KVC是Key Value Coding的缩写,意思是键值编码。
在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过getter/setter方法来访问对象的属性。
用KVC可以间接访问对象属性的机制。通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法。
—————————————————————————————————————————————————————————————
二 常用方法及特性
1)KVC的常用方法
- (id)valueForKey:(NSString *)key; ------根据key的值读取对象的属性
- (void)setValue:(id)value forKey:(NSString *)key; ------根据key的值来写对象的属性
setNilValueForKey: 当对非类对象属性设置nil时,调用,默认抛出异常。
valueForUndefinedKey:------错误拦截,当key的值是没有定义的,这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来
KVC 最常用的还是在序列化和反序列话对象。尤其是在json 转模型的时候,KVC让程序员摆脱了繁琐无营养的代码堆积。减少代码量就是减少出错的概率
2)
使用 KVC 为对象赋值或者取值时,需要知道准确的键值, 相比较点语法,KVC 是一种间接的传递方式,这种方式有利于
对象解耦,让对象彼此之间的耦合度不会太高。
KVC 不但能够赋值,而且还能破坏只读的特性。OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力,这样做就会破坏类的封装性. 类的私有属性和只读属性都可以通过KVC去访问.
当然这只是我们需要注意的一个细节,更重要的是KVC 有自动装箱(自动类型转换)的功能,我们不需要去转换类型了。
3)、支持键值路径(keyPath)
什么叫支持键值路径?键值路径是对于一个类中有数组对象的属性进行便捷操作
说白了就是支持嵌套。因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去(KVC在按照键值路径取值时,会自动层层深入,获取对应的键值)
4)支持操作符
假如我们有10个字符串,我们想求出这10个字符串的总长度,我们可以使用KVC提供的操作符。
NSArray *books=@[@"鸟哥烧烤私房菜",@"程序员摊煎饼宝典",@"麻辣烫基础教程"];
NSLog(@"%@",[books valueForKeyPath:@"@sum.length"]);
这里的@sum 是KVC 提供的,不是我们写的。像这样的函数共有5个@avg,@count,@max,@min,@sum。我们直接用就可以了
5)KVC的缺点:
一旦使用 KVC 你的编译器无法检查出错误,即不会对设置的键、键路径进行错误检查,且执行效率要低于合成存取器方法和自定的 setter 和 getter 方法。因为使用 KVC 键值编码,它必须先解析字符串,然后在设置或者访问对象的实例变量。所以只有当你非常需要它提供的可扩展性时才使用它。
—————————————————————————————————————————————————————————————
三 KVC机制通过key找到value的原理
当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过下面几种不同的方式解析这个调用。
首 先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException 异常错误。
补充:KVC查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方 法, 前面加一个get,或者_someKey以_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找 _someKey这个变量是否存在。
设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。
iOS开发之---KVC全解的更多相关文章
- iOS开发之KVC全解
一 KVC的基本概念 1.KVC是Key Value Coding的缩写,意思是键值编码. 在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过g ...
- iOS开发技巧系列---详解KVC(我告诉你KVC的一切)
KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...
- iOS开发中KVC、KVO简介
在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...
- iOS开发基础-KVC简单介绍
一.KVC介绍 键值编码(Key Value Coding,KVC):使开发者不必进行任何操作就可以进行属性的动态读写. KVC操作方法由 NSKeyValueCoding 协议提供,而 NSObje ...
- 李洪强iOS开发之最全App上架流程
在上架App之前想要 真机测试的同学 请查看 iOS- 最全的真机测试教程 里面包含怎么让多台电脑同时 上架App和同时真机调试.P12文件的使用详解 准备 开发者账号 完工的项目 上架步骤 一.创建 ...
- iOS开发——GCD多线程详解
GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...
- ios开发之--UIWebView全属性
最近的项目当中需要用到html和ios的交互,所以就凑空整理一下,所有webView相关的方法和属性,如有不对的地方,请大家不吝指教! 代码如下: 1,创建webview并设置代理 UIWebView ...
- 李洪强iOS开发之基于彻底解耦合的实验性iOS架构
基于彻底解耦合的实验性iOS架构 这周我决定做一个关于彻底解耦合的应用架构的实验.我想探究的主题是: “如果所有的应用内通讯都通过一个事件流来完成会怎么样?” 我构造了一个待办事项应用,因为这是我 ...
- IOS开发-KVC
1. 什么是kvc kvc--key-value coding,健值编码 可以通过key直接访问对象属性的value的方法 2.使用场景 kvc主要是为了让代码变的更简介明了 用的比较多的是在后台数据 ...
随机推荐
- python进阶02
1.import导入模块 import sys sys.path:显示的是:从显示目录中查找要导入的模块文件. 程序执行时导入模块路径:sys.path.append('/home/itcast/xx ...
- dedecms 织梦列表页标题增加显示页数
判断是否为第一页,为第一页则不显示页数的代码: {dede:pagelist listsize='0' listitem='pageno' function='html2text(@me)' runp ...
- WIN7 X64 PASSUAC 源码
// Passuac.cpp : Defines the entry point for the console application. // #include "stdafx.h&quo ...
- java对象流(二)
对象流,可以将java中的对象转为字节进行输出.将对象写入文件时.文件输出流是将字节写入到文件中. 对象流是将给定的对象转化为一组字节.writeObject()方法就是将对象转为字节. 对象流,读的 ...
- python中模块的引用
一. 模块的定义 定义 python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句.模块让你能够有逻辑地组织你的python代码段,把相关的代 ...
- lightoj1422 区间dp
对于这一题想了很久真的是一点头绪也没有,还有组数明明是200,数据范围100,O(n^3)的复杂度居然不会爆掉(可能是因为一直在想怎么用O(n^2)的复杂度做这题 做法是先预处理dp,对于dp[i][ ...
- 解决 Firefox 火狐浏览器下载 .exe 文件卡住的问题 以及关闭测试版cache2
解决 Firefox 火狐浏览器下载 .exe 文件卡住的问题 在firefox浏览器地址栏里输入:about:config 点“我保证会小心”,显示firefox的高级配置列表 在配置页面的搜索框里 ...
- deep learning 学习笔记(三) 线性回归学习速率优化寻找
继续学习http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html,上一节课学习速率是固定的,而这里我们的目的是找到一个比较好 ...
- CentOS学习笔记(一):中文语言包及输入法的安装使用
1.中文语言包安装 命令行执行: yum install fonts-chineseyum install fonts-ISO8859-2 2.切换成中文语言 菜单->System->Ad ...
- 使文字出现波纹效果--第三方开源--Titanic
下载地址:https://github.com/RomainPiel/Titanic 使用的时候直接将代码复制过来即可(注意res文件下有张波浪图也要一起复制) xml代码: <com.roma ...