Objective-C之KVC、KVO
1,KVC(键值编码) Key Value Coding
1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进行读写。
1.2KVC的操作方法由NSKeyValueCoding协议来定义,而Object对象实现该协议,所以所有的对象都具有KVC功能
动态设置:setValue:属性值 forKey:属性名 setValue: 属性值forKeyPath:属性路径
动态读取:valueForKey:属性名 valueForKeyPath:属性路径
名词解释:属性名(简单路径) 属性路径(复合路径,比如A对象有一个b属性,那么A.b就是复合属性)
1.3KVC动态设置规则:(假设对a进行设置)首先查找setA方法,如果没有setA方,则查找_a变量,如果没有_a变量,则查找a变量,如果没有a变量,则调用 setValue: forUndefinedKey:方法。对于方法和属性,不管公有还是私有都可以设置成功
1.4KVC动态读取规则:(假设对a进行读取)首先读取a方法,如果没有a方法,则查找_a变量,如果没有_a变量,则查找a变量,如果没有a变量,则调用valueForUndefinedKey:方法。对于方法和属性,不管公有还是私有都可以设置成功
1.5 KVC 与 对象的读写方法有什么区别
1,可以通过属性的名字直接访问属性,而不是调用的属性的accssor。
2,减少代码量
for example:场景一:
People *people = [peoleArray objectAtIndex:row];
if ([[column identifier] isEqualToString:@"name"]) {
return [people name];
}
if ([[column identifier] isEqualToString:@"age"]) {
return [people age];
}
利用KVC : return [people valueForKey:[colum identifier]];
场景二:可以把一个NSDictionary 的元素直接赋值给对象的属性。
-(id) initWithDictionary:(NSMutableDictionary*) jsonObject
{
if((self = [super init]))
{
[self init];
[self setValuesForKeysWithDictionary:jsonObject];
}
return self;
}
setValuesForKeysWithDictionary: 把NSDictionary中key对应的对象属性设置上NSDictionary中key对应的value.
异常处理:(1)如果NSDictionary中key 与对象中属性的名称不一致时,我们需要 setValue: forUndefinedKey: 方法来处理没有匹配上的属性,否则setValuesForKeysWithDictionary:将抛出异常(NSUndefinedKeyException)
(2)如果NSDictionay 内嵌的结构比较复杂:Products{product1{count:xx, sumPrice:xx}}, product2{} ….},我们需要重写 setValue: forKey: 方法。
- -(void) setValue:(id)value forKey:(NSString *)key
- {
- if([key isEqualToString:@"products"])
- {
- for(NSMutableDictionary *productDict in value)
- {
- Prodcut *product = [[Product alloc] initWithDictionary:prodcutDict];
- [self.products addObject:product];
- }
- }
- }
场景三: 我们需要把数组里People对象的name名字的首字母大写,调用kvc:
return [array valueForKeyPath:@"name.capitalizedString"] (这里是valueForKeyPath)
1.6 KVC集合运算符
插入一个知识点:NSNumber 封装的数据类型有 Char,UnsignedChar, Short, UnsignedShort, Int, UnsignedInt, Long, UnsignedLong, LongLong, UnsignedLongLong, Float, Double, Bool, Integer, UnsingedInteger.
NSValue 封装的数据类型:CGPoint, CGSize, CGRect, CGAffineTransform, UIEdgeInsets, UIOffset.
集合运算符是一组特殊的key path,只能传递给 valueForKeyPath: 该方法。
集合运算符的格式:
共支持5种运算:@sum @avg @count @max @min
2,KVO(键值监听) Key Value Observing (观察者模式)
2.1KVO的操作方法由NSKeyValueObserving协议来指定,NSObject对象实现了该协议,所以所有的对象都拥有KVO操作。
2.2KVO操作的方法如下:
注册指定key路径的监听器: addObserver: forKeyPath: options: context:
删除指定key路径的监听器:removeObserver: forKeyPath:、 removeObserver: forKeyPath: context:
监听器回调方法: observeValueForKeyPath: ofObject: change: contenxt:
options的值说明:
NSKeyVlaueObservingOptionNew
需要补充。。。。。。。
change: 参数为NSDictionary , key 为 new 和 old
2.3KVO 与NSNotificationCenter的区别
好处:1,代码更简洁,不需要修改被观察的类,永远都是观察者在做事情
不足:1,如果没有observer 监听 keyPath, removeOberser: forKeyPath: 会crash。
2,很难定位是谁监听了对象的属性
2.4 KVO的自动触发与手动触发
自动触发原理:键值观察通知依赖于NSObject的两个方法:willChangeValueForKey: 和 didChangeVlaueForKey:。在一个被观察属性发生改变之前,调用willChangeValueForKey,改变之后调用didChangeVlaueForKey,然后调用 observerValueForKey: ofObject: change: context:.
模拟一个被观察属性发生改变场景:
- (void)setNow:(NSDate *)aDate { [self willChangeValueForKey:@"now"]; // 运行时,自动添加方法 _now = aDate; [self didChangeValueForKey:@"now"];// 运行时,自动添加方法 }实现原理, isa-Swizzing.
原理解释: 当我们监听一个对象时,一个新类会被创建,新类继承自原来对象的类,并重写了被观察属性的setter方法,(运行时,加入了自动触发属性变更的通知),最后通过isa-Swizzing,把这个对象的isa指针,指向新创建的子类。

该图来自(ios程序猿)
Objective-C之KVC、KVO的更多相关文章
- KVC/KVO原理详解及编程指南
一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...
- 【转】 KVC/KVO原理详解及编程指南
原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...
- kvc/kvo复习
kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...
- 转:KVC/KVO原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...
- 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO
知识点复习 1. 触摸事件&手势识别 1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加) 附加在某一个特定视图上的, ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- KVC & KVO
KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value Observing的简写,是键值观察的意思.那么我们能拿KV ...
- KVC&&&KVO
KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...
- 04 KVC|KVO|Delegate|NSNotification区别
一. iOS 中KVC.KVO.NSNotification.delegate 在实际的编程中运用的非常多,掌握好他们的运行原理和使用场合对于我们程序的开发将会带来事办工倍的效果: 二. KVC ...
随机推荐
- Angular2笔记:NgModule
Angular的模块的目的是用来组织app的逻辑结构. 在ng中使用@NgModule修饰的class就被认为是一个ng module.NgModule可以管理模块内部的Components.Dire ...
- .NET基础拾遗(1)类型语法基础和内存管理基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...
- 新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序
在博客园学习很长时间了,今天终于自己也开通了博客,准备分享一些感悟和经验.首先感谢博客园园主提供了这么好的程序员学习交流平台,也非常感谢张善友.dax.net.netfocus.司徒正美 等技术大牛的 ...
- JavaScript dom 标签属性
节点: 平时开发中常用的节点是: 元素节点:nodeType值是 1 --> <a>,<p>...... 属性节点:nodeType值是 2 --> t ...
- 使用python实现短信PDU编码
前几天入手一个3G模块,便倒腾了一下.需要发送中英文混合短信,所以采用PDU模式(不了解google ^_^). 最大问题当然就是拼接PDU编码(python这么强大,说不定有模块),果不其然找到一个 ...
- Bootstrap3系列:输入框组
1. 基本实例 通过在文本输入框 <input> 前面.后面或是两边加上文字或按钮,实现对表单控件的扩展. .input-group包含.input-group-addon给 .form- ...
- ILMerge合并多个DLL
序言 如果你的项目要提供多个dll给别人用,那么不妨让你的dll合并为一个,让别人看起来简洁,引用起来不会过于繁琐. 本篇比较少,但也算是比较实用吧. 下载微软的辅助工具ILMerge Imerge下 ...
- 实践 Neutron FWaaS - 每天5分钟玩转 OpenStack(118)
前面我们学习了 FWaaS 的理论知识,今天将通过实验来学习 FWaaS. 在我们的实验环境中,有两个 instance: cirros-vm1(172.16.100.3) 和 cirros-vm2( ...
- Node.js:events事件模块
Nodejs的大部分核心API都是基于异步事件驱动设计的,所有可以分发事件的对象都是EventEmitter类的实例. 大家知道,由于nodejs是单线程运行的,所以nodejs需要借助事件轮询,不断 ...