这两天在看和这个相关的的内容,看的不是很明白,所以找了段代码,理解下,网上看到最多的一段的关于kvc 的代码
一 先上代码
- 1 .person类
- @implementation Person
- @synthesize name,age;
- -(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);
-
-
- [p setValue:@"name kvc" forKey:@"name"];
-
-
- NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]);
-
-
- p.name=@"name change by .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=
- 最后一次修改是直接修改 所以没法产生通知
二 分析
2.1概念简述
访问一个对象属性我们可以 person.name 也可以通过kvc的方式 [person valueForKey:@"name"]
kvc 是 Key Value Coding 的缩写,这种机制引入的原因大概是“MVC with less code”
kvo 就是一个在语言框架层面实现的观察者模式 通过kvc的方式修改属性时,会主动通知观察者
最后一个是直接修改数据不是kvc 模式修改数据,所以不会检测到数据的变化,即打印出数据的变化。
2.2问题
- 1 p.name=@"name change by .name=";
不是一个kvc 模式,为什么他也会监测?
2 [p setValue:@"name kvc" forKey:@"name"];
设置的key 是局部的还是全局的,就像那个[NSUserdefaulr Standdefuler]那样的
本文出自 “技术成就梦想” 博客http://285746555.blog.51cto.com/2966432/622176