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";
结果:
最新文章
- 在C#中实现Json的序列化与反序列化
- 各大搜索引擎的User-Agent
- Service Trace Viewer Tool (SvcTraceViewer.exe)
- VC++ 控制台不自动退出
- JVM学习之GC参数设置
- ****K - Alien's Organ
- CodeFroces--Good Bye 2016-B--New Year and North Pole(水题-模拟)
- JS常用函数用途小记
- 日期求星期(java)-蓝桥杯
- sql server 新语法 收藏
- 20165221学习基础和C语言基础调查
- ext.js的mvc开发模式详解
- C# process 隐藏应用程序的进度条
- Android中控制Dialog呈现的时间
- DelphiXE7 Datasnap TDSClientCallbackChannelManager内部实现初探
- 团体程序设计天梯赛L3-019 代码排版(23分)
- CVE-2010-0249 极光
- docker 安装 MySQL 8.0
- 完全禁用Wordpress的升级功能
- 自测之Lesson5:标准I/O
热门文章
- Gitlab. Disable user creation on welcome page
- LeetCode Bulls and Cows (简单题)
- wddm 部署问题解决
- Why did Jimmy Wales invest in Quora? Is he afraid that it will take over Wikipedia?
- [转载] Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
- Linux磁盘文件的命名
- 下载abap 源代码
- ZOJ 1115 Digital Roots
- 浅谈jQuery中setInterval()方法
- 启动tomcat不出现命令窗口