zoukankan      html  css  js  c++  java
  • 转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 模式修改数据,所以不会检测到数据的变化,即打印出数据的变化。

  • 相关阅读:
    Java异常
    docker安装和介绍(基于centos 7)
    centos7搭建gitlab版本控制系统
    webstorm快捷键使用
    Extjs-note
    mak iso
    windows上的硬盘挂载到linux上的步骤方法
    【JAVA笔记——术】JSP中乱码问题的解决方法
    PHP获得IP方式
    ubuntu安装hadoop 若干问题的解决
  • 原文地址:https://www.cnblogs.com/leevaboo/p/2937973.html
Copyright © 2011-2022 走看看