IPHONE 和 KVC/KVO

這兩天在看和這個相關的的內容,看的不是很明白,因此找了段代碼,理解下,網上看到最多的一段的關於kvc 的代碼app

一  先上代碼框架

 

  
  
  
  
  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. 最後一次修改是直接修改  因此無法產生通知 

 

二    分析less

 2.1概念簡述ide

        訪問一個對象屬性咱們能夠 person.name  也能夠經過kvc的方式   [person valueForKey:@"name"]函數

    kvc  是  Key Value Coding   的縮寫,這種機制引入的緣由大概是「MVC with less code」測試

     kvo 就是一個在語言框架層面實現的觀察者模式 經過kvc的方式修改屬性時,會主動通知觀察者spa

最後一個是直接修改數據不是kvc 模式修改數據,因此不會檢測到數據的變化,即打印出數據的變化。code

2.2問題 server

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

         不是一個kvc 模式,爲何他也會監測?對象

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

       設置的key 是局部的仍是全局的,就像那個[NSUserdefaulr  Standdefuler]那樣的

相關文章
相關標籤/搜索