您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: