OC-设计模式KVC+KVO定义及使用
一.KVC
Key-Value-Coding 键值编码(KVC:是一种存取值的方式,通过key存value 或者通过key获取value
key从哪里来的呢?
key 把对象里面的属性名、变量名当作了一个key(把属性名看成了一个普通的字符串来使用)
以字符串的形式向对象发送消息,字符串是存取值的关键字;
例子:
在person类中声明了一个name属性,并初始化一个对象sushi。

存值:,,,,,,,setValue:,,,,,,,forKey:,,,,,,,,
[sushi setValue :@"苏轼"forKey:@"shshi"];
取值:,,,,,,,valueForKey:,,,,,,,
NSString *str = [sushi valueForKey :@"sushi"];
路径存取值,用“ . ”来表示 它是一个键路径(不是属性的那种哦!!)
//通过路径查找人家里狗身上的跳蚤,在Person类里声明一个狗的类型dog,在狗的类里声明一个跳蚤类型的tiao。在跳蚤类里声明一个name的属性。初始化狗gg,跳蚤tt。
首先要他们联系起来,相互知道:
[sushi setValue:gg forKey:@"dog"];
[gg setValue:tt forKey:@"tiao"];
存值:setValue:,,,,,,,,forKeyPath:,,,,,,,,
[sushi setValue:@"跳蚤"forKeyPath:@"dog.tiao.name"] ;
取值:valueForKeyPath:,,,,,,,,
NSString *name = [sushi valueForKeyPath:@"dog.tiao.name"];

二.KVO
Key-Value-Observer 键值观察者
通过Key来观察Value的变化 去做出响应
KVO主要用于视图交互方面,比如界面的某些数据变化了,界面的显示也跟着需要变化,那就需要建立数据和界面的关联。
KVO是一对一的传值
通过key来检测值是否发生改变 如果发生改变 就会调用KVO的响应方法
Key-Value-Observer 键值观察者
是一对一传值
通过key来检测值是否发生改变 如果发生改变 就会调用kvo的响应方法。
如果使用完观察者 就需要移除观察者,防止再次使用通知 接收不到消息
例子:让一个人观察一个狗的表情变化。
首先在狗中定义一个属性 face;
在观察者 中定义一个方法 通过key来检测值是否发生改变
-(void)watch:(Dog *)dog{
_dog = dog;//这里是为了后面移除观察者
[_dog addObserver:self forKeyPath: @“face” options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil ];
{
当检测的值发生改变的时候,自动调用下面这个方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
//然后判断开始做出你想要的反应
if(keyPath isEqualToString :@"face")
{
NSLog(@"狗的表情由%@变成了%@",change[@"old"],change[@"new"]);
[self eat]//做出自己想要的反应
}
}
-(void)eat{
NSLog(@"丢一块肉");
}
//移除观察者
-(void)dealloc{
[_dog removeObserver:self forKeyPath:@"face"];
在主文件中
Dog *moyangquan = [Dog new];
moyangquan.face = @“smile";
Person *liBai = [Person new];
[liBai watchDog:moyangquan];
//狗的发生改变
moyangquan.face = @“wangwang";
结果:

OC-设计模式KVC+KVO定义及使用的更多相关文章
- OC之KVC,KVO
KVO简介 在 Cocoa 的模型-视图-控制器 (Model-view-controller)架构里,控制器负责让视图和模型同步.这一共有两步:当 model 对象改变的时候,视图应该随之改变以反映 ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- 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原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...
- 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO
知识点复习 1. 触摸事件&手势识别 1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加) 附加在某一个特定视图上的, ...
- kvc/kvo复习
kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...
- 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)
学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...
- QF——OC中的KVC,KVO
KVC: (Key Value Coding) 键值编码 所谓KVC,其实就是不通过set和get方法访问对象属性,而是通过属性名字符串动态的去读取属性.KVC其实也是OC反射机制的一种运用. 之所以 ...
随机推荐
- Warning: Data truncated for column 'AirPress' at row 1
/************************************************************************ * Warning: Data truncated ...
- Android 2.3 不支持印度文
Android 2.3 不支持印度文(hindi),即使你指定了相关的字符串也不行,它们一律显示为方格. 实际上,你在系统的语言设置界面也可以看到,印度文一行也是被显示为方格(既然是方格,如何知道它是 ...
- Sprint第二个冲刺(第六天)
一.Sprint 计划会议: 因为这两天课程较多的原因,表面上进度可能可能没有太大的变化,其实组员们都有完善之前做的功能,正在做的功能也在抓紧时间完成.俗话说得好,慢工出细活 ,不能因为赶进度就随便做 ...
- 关于string的练习题目
/*Are they equal*/#include<iostream>#include<string>using namespace std;int n;string dea ...
- Spring-IOC之前世今生
没使用IOC之前 贯用工厂模式调用 bean组件 可类比为: 去商场买东西,你是先想好自己要买什么了,然后去寻找商品(逛商场的同学不要扯皮啊2333) 用了IOC之后 可类比为: 所有网上购物,所有的 ...
- C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
- leetcode 153. Find Minimum in Rotated Sorted Array --------- java
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- HDU-4521 小明系列问题――小明序列(线段树)
题目大意:求LIS,但是要求LIS中相邻的两个元素之间的距离要大于d. 题目分析:线段树.节点(l,r)保存信息为LIS的最后一个元素落在[l,r]之间的最大长度.从第d+2个元素开始查询更新操作,但 ...
- 【BZOJ1007】【HNOI2008】水平可见直线
依旧看黄学长代码,不过这回是看完后自己写的 原题: 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例 ...
- Linux内核源代码的结构(转)
源代码所有在目录:/usr/src/linux (大部分linux发行版本中) init 内核初始化代码 kernel 内核核心部分:进程.定时.程序执行.信号.模块... mm 内存处理 a ...