转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.     p.name =  @"name";
  28.    //监视对象 
  29.    PersonMonitor *pm= [[PersonMonitor alloc]init]; 
  30.     [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil]; 
  31.    
  32. //测试前的数据 
  33.     NSLog(@"p.name is %@",p.name); 
  34.     
  35. //通过setvalue 的方法,PersonMonitor的监视将被调用 
  36.   [p setValue:@"name kvc" forKey:@"name"]; 
  37.   
  38. //查看设置后的值 
  39.    NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]); 
  40.  
  41. //效果和通过setValue 是一致的     
  42. p.name=@"name change by .name="
  43.  
  44.  //通过person自己的函数来更改name  
  45.      [p changeName];  
  46.  
  47.  结果是 
  48. 输出 
  49. 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name 
  50. 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name   new:name kvc 
  51. 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc 
  52. 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc   new:name change by .name= 
  53. 最后一次修改是直接修改  所以没法产生通知 

二    分析

 2.1概念简述

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

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

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

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

原文地址:https://www.cnblogs.com/leevaboo/p/2937973.html