这两天在看和这个相关的的内容,看的不是很明白,因此找了段代码,理解下,网上看到最多的一段的关于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]那样的