Iphone 和 KVC/KVO

来源:互联网 发布:apache 虚拟主机 编辑:程序博客网 时间:2024/06/05 11:55

这两天在看和这个相关的的内容,看的不是很明白,所以找了段代码,理解下,网上看到最多的一段的关于kvc 的代码

一  先上代码

 

  1. 1 .person类 
  2. @implementation Person 
  3. @synthesize name,age;//属性name 将被监视 
  4. -(void) changeName 
  5.     name=@"changeName directly"
  6. @end 
  7.  
  8.  
  9. 2.PersonMonitor类  监视了name属性 
  10. @implementation PersonMonitor 
  11.  
  12. - (void)observeValueForKeyPath:(NSString *)keyPath 
  13.                       ofObject:(id)object 
  14.                         change:(NSDictionary *)change 
  15.                        context:(void *)context 
  16.     if ([keyPath isEqual:@"name"]) 
  17.     { 
  18.         NSLog(@"change happen, old:%@   new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]); 
  19.     } 
  20. @end 
  21.  
  22.  
  23. 3测试代码 
  24.  
  25.    //初始化被监视对象 
  26.     Person *p =[[Person alloc] init]; 
  27.    //监视对象 
  28.    PersonMonitor *pm= [[PersonMonitor alloc]init]; 
  29.     [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil]; 
  30.    
  31. //测试前的数据 
  32.     NSLog(@"p.name is %@",p.name); 
  33.     
  34. //通过setvalue 的方法,PersonMonitor的监视将被调用 
  35.   [p setValue:@"name kvc" forKey:@"name"]; 
  36.   
  37. //查看设置后的值 
  38.    NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]); 
  39.  
  40. //效果和通过setValue 是一致的     
  41. p.name=@"name change by .name="
  42.  
  43.  //通过person自己的函数来更改name  
  44.      [p changeName];  
  45.  
  46.  结果是 
  47. 输出 
  48. 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name 
  49. 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name   new:name kvc 
  50. 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc 
  51. 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc   new:name change by .name= 
  52. 最后一次修改是直接修改  所以没法产生通知 

 

二    分析

 2.1概念简述

        访问一个对象属性我们可以 person.name  也可以通过kvc的方式   [person valueForKey:@"name"]

    kvc  是  Key Value Coding   的缩写,这种机制引入的原因大概是“MVC with less code”

     kvo 就是一个在语言框架层面实现的观察者模式 通过kvc的方式修改属性时,会主动通知观察者

最后一个是直接修改数据不是kvc 模式修改数据,所以不会检测到数据的变化,即打印出数据的变化。

2.2问题

    • 1 p.name=@"name change by .name=";

         不是一个kvc 模式,为什么他也会监测?

      2  [p setValue:@"name kvc" forKey:@"name"]; 

       设置的key 是局部的还是全局的,就像那个[NSUserdefaulr  Standdefuler]那样的

 

 

本文出自 “技术成就梦想” 博客http://285746555.blog.51cto.com/2966432/622176

原创粉丝点击