這兩天在看和這個相關的的內容,看的不是很明白,因此找了段代碼,理解下,網上看到最多的一段的關於kvc 的代碼app
一 先上代碼框架
- 1 .person類
- @implementation Person
- @synthesize name,age;//屬性name 將被監視
- -(void) changeName
- {
- name=@"changeName directly";
- }
- @end
- 2.PersonMonitor類 監視了name屬性
- @implementation PersonMonitor
- - (void)observeValueForKeyPath:(NSString *)keyPath
- ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context
- {
- if ([keyPath isEqual:@"name"])
- {
- NSLog(@"change happen, old:%@ new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]);
- }
- }
- @end
- 3測試代碼
- //初始化被監視對象
- Person *p =[[Person alloc] init];
- //監視對象
- PersonMonitor *pm= [[PersonMonitor alloc]init];
- [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil];
- //測試前的數據
- NSLog(@"p.name is %@",p.name);
- //經過setvalue 的方法,PersonMonitor的監視將被調用
- [p setValue:@"name kvc" forKey:@"name"];
- //查看設置後的值
- NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);
- //效果和經過setValue 是一致的
- p.name=@"name change by .name=";
- //經過person本身的函數來更改name
- [p changeName];
- 結果是
- 輸出
- 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name
- 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name new:name kvc
- 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc
- 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc new:name change by .name=
- 最後一次修改是直接修改 因此無法產生通知
二 分析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
不是一個kvc 模式,爲何他也會監測?對象
2 [p setValue:@"name kvc" forKey:@"name"];
設置的key 是局部的仍是全局的,就像那個[NSUserdefaulr Standdefuler]那樣的