一.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";

结果:

最新文章

  1. 在C#中实现Json的序列化与反序列化
  2. 各大搜索引擎的User-Agent
  3. Service Trace Viewer Tool (SvcTraceViewer.exe)
  4. VC++ 控制台不自动退出
  5. JVM学习之GC参数设置
  6. ****K - Alien's Organ
  7. CodeFroces--Good Bye 2016-B--New Year and North Pole(水题-模拟)
  8. JS常用函数用途小记
  9. 日期求星期(java)-蓝桥杯
  10. sql server 新语法 收藏
  11. 20165221学习基础和C语言基础调查
  12. ext.js的mvc开发模式详解
  13. C# process 隐藏应用程序的进度条
  14. Android中控制Dialog呈现的时间
  15. DelphiXE7 Datasnap TDSClientCallbackChannelManager内部实现初探
  16. 团体程序设计天梯赛L3-019 代码排版(23分)
  17. CVE-2010-0249 极光
  18. docker 安装 MySQL 8.0
  19. 完全禁用Wordpress的升级功能
  20. 自测之Lesson5:标准I/O

热门文章

  1. Gitlab. Disable user creation on welcome page
  2. LeetCode Bulls and Cows (简单题)
  3. wddm 部署问题解决
  4. Why did Jimmy Wales invest in Quora? Is he afraid that it will take over Wikipedia?
  5. [转载] Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
  6. Linux磁盘文件的命名
  7. 下载abap 源代码
  8. ZOJ 1115 Digital Roots
  9. 浅谈jQuery中setInterval()方法
  10. 启动tomcat不出现命令窗口