KVC与KVO理解
2015-06-02 14:47
239 查看
Key-Value Coding(KVC)
KVC,是指 NSKeyValueCoding,NSObject 的分类, NSObject(NSKeyValueCoding) ,提供一种机制来间接访问对象的属性和值。KVO是基于KVC实现的关键技术之一。
例如:一个Person对象有一个name和一个age属性,一个book对象,
Person *p = [[Person
alloc] init];
p.name =
@"Jack";
p.age =
10;
Book *book=[[Book
alloc] init];
book.name=@"倾城之恋";
p.book=book;
NSString *presonName=[p
valueForKeyPath:@"name"];
NSLog(@"presonName-----%@",presonName);
打印如下:
presonName-----Jack
NSString *bookName=[[p
valueForKey:@"book"]
valueForKey:@"name"];等价于
NSString *presonName=[p valueForKeyPath:@"book.name"];
NSLog(@"bookName-----%@",bookName);
打印如下:
bookName-----倾城之恋
注意:key和key path的区别,key可以从一个对象获取值,而 key path 可以将多个key用点号“.”分开
Key-Value Observing (KVO)
Key-Value Observing (KVO)建立在kvc之上,它能够观察一个对象key path值得改变
例如:
- (void)viewDidLoad
{
[super
viewDidLoad];
HMPerson *p = [[HMPerson
alloc] init];
p.age =
20;
//实现观察
[p addObserver:self
forKeyPath:@"age"
options:NSKeyValueObservingOptionOld |
NSKeyValueObservingOptionNew
context:nil];
//改变值
p.age =
30;
self.p = p;
}
//停止观察
- (void)dealloc
{
[self.p
removeObserver:self
forKeyPath:@"age"];
}
/**
* 当监控的某个属性的值改变了就会调用
*
* @param keyPath
属性名(哪个属性改了?)
* @param object
哪个对象的属性被改了?
* @param change
属性的修改情况(属性原来的值、属性最新的值)
* @param context void * == id
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary
*)change context:(void *)context
{
NSLog(@"%@对象的%@属性改变了:%@", object,
keyPath, change);
}
打印如下:
<HMPerson: 0x7fac02ce0d20>对象的age属性改变了:{
kind = 1;
new = 30;
old = 20;
}
KVC,是指 NSKeyValueCoding,NSObject 的分类, NSObject(NSKeyValueCoding) ,提供一种机制来间接访问对象的属性和值。KVO是基于KVC实现的关键技术之一。
例如:一个Person对象有一个name和一个age属性,一个book对象,
Person *p = [[Person
alloc] init];
p.name =
@"Jack";
p.age =
10;
Book *book=[[Book
alloc] init];
book.name=@"倾城之恋";
p.book=book;
NSString *presonName=[p
valueForKeyPath:@"name"];
NSLog(@"presonName-----%@",presonName);
打印如下:
presonName-----Jack
NSString *bookName=[[p
valueForKey:@"book"]
valueForKey:@"name"];等价于
NSString *presonName=[p valueForKeyPath:@"book.name"];
NSLog(@"bookName-----%@",bookName);
打印如下:
bookName-----倾城之恋
注意:key和key path的区别,key可以从一个对象获取值,而 key path 可以将多个key用点号“.”分开
Key-Value Observing (KVO)
Key-Value Observing (KVO)建立在kvc之上,它能够观察一个对象key path值得改变
例如:
- (void)viewDidLoad
{
[super
viewDidLoad];
HMPerson *p = [[HMPerson
alloc] init];
p.age =
20;
//实现观察
[p addObserver:self
forKeyPath:@"age"
options:NSKeyValueObservingOptionOld |
NSKeyValueObservingOptionNew
context:nil];
//改变值
p.age =
30;
self.p = p;
}
//停止观察
- (void)dealloc
{
[self.p
removeObserver:self
forKeyPath:@"age"];
}
/**
* 当监控的某个属性的值改变了就会调用
*
* @param keyPath
属性名(哪个属性改了?)
* @param object
哪个对象的属性被改了?
* @param change
属性的修改情况(属性原来的值、属性最新的值)
* @param context void * == id
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary
*)change context:(void *)context
{
NSLog(@"%@对象的%@属性改变了:%@", object,
keyPath, change);
}
打印如下:
<HMPerson: 0x7fac02ce0d20>对象的age属性改变了:{
kind = 1;
new = 30;
old = 20;
}
相关文章推荐
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
- OC笔记,数组NSArray
- 工作周报044
- 解决Ajax在IE浏览器中缓存问题
- imageloader+scaleimageview+viewpager组合异步加载图片的图片浏览功能
- weblogic禁止访问控制台问题
- Broken Keyboard
- Libevent0.1之测试Libevent自带的例子
- Android所有的自带系统图片
- Google NFC Basics (谷歌官网NFC翻译)
- 工作周报045
- wxWidgets 小记
- ffmpeg用代码实现自己的muxer
- 关于大型网站技术演进的思考(八)--存储的瓶颈终篇(8)
- Split Animation Clip From FBX and Multiply Mode Sprite
- 上传文件
- Linux Shell脚本系列教程(一):Shell入门
- 网络拓扑简析
- ExtJS结合WCF/Jquery结合WCF 分别开发的非常优秀的网页聊天工具,持续更新
- 隐藏浏览器中php,apache,varnish,nginx版本信息