KVC与KVO理解

来源:互联网 发布:数据库索引怎么建立 编辑:程序博客网 时间:2024/05/29 09:42

Key-Value Coding(KVC)

KVC,是指 NSKeyValueCoding,NSObject 的分类, NSObject(NSKeyValueCoding) ,提供一种机制来间接访问对象的属性和值。KVO是基于KVC实现的关键技术之一。

例如:一个Person对象有一个name和一个age属性,一个book对象,

   Person *p = [[Personalloc] init];

    p.name =@"Jack";

    p.age =10;

    Book *book=[[Bookalloc] init];

    book.name=@"倾城之恋";

    p.book=book;



NSString *presonName=[p valueForKeyPath:@"name"];

NSLog(@"presonName-----%@",presonName);

打印如下:

presonName-----Jack


NSString *bookName=[[pvalueForKey:@"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

{

    [superviewDidLoad];

    HMPerson *p = [[HMPersonalloc] init];

    p.age =20;

      //实现观察

    [p addObserver:selfforKeyPath:@"age"options:NSKeyValueObservingOptionOld |NSKeyValueObservingOptionNew context:nil];

    //改变值

    p.age =30;

    self.p = p;

}


   //停止观察

- (void)dealloc

{

    [self.premoveObserver:selfforKeyPath:@"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;

}















0 0
原创粉丝点击