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 模式修改数据,所以不会检测到数据的变化,即打印出数据的变化。

  • 相关阅读:
    android webview 使用以及一些异常处理及上传文件问题
    bootstrap 下拉菜单不显示的解决办法
    无损图片缩放
    startssl,免费的ssl证书申请及注意事项
    iis7.5
    vs2013 类名颜色显示黑色,无法修改
    "未能找到类型或命名空间名称",引用dll的时候出错
    由于 add 运算符中“Chinese_PRC_CI_AS”和“Chinese_PRC_CS_AS_WS”之间的排序规则冲突
    asp.net mvc int[] 和 string[] 自定义数组绑定
    windbg定位WEB性能瓶颈案例一则
  • 原文地址:https://www.cnblogs.com/leevaboo/p/2937973.html
Copyright © 2011-2022 走看看