一、KVC与KVO
* “ KVC ”: key value Coding ( 键值编码 )
* 目的 : 间接 的 修改或获取 对象的属性 , 降低程序 ( 类与类 ) 之间的耦合度 .
* “KVO ”:key value Observer (键值观察),观察者模式.(检测模型变化用的多)
* 目的 :通常用于观察 某个对象的某个属性发生变化 时,及时做出相应.
二、KVC的使用方式
KVC被称为iOS开发平台的大招!!! 能快速修改对象属性。
* [p1setValue :@“xxxx”forKeyPath :@“name”];修改指定对象属性.
* [arrvalueForKeyPath :@“book.bookName”]; 获取对象属性.
* KVC通过键能直接取得数组.
* 在使用KVC时, 一定要保证键值是存在 的.
* 原理 : KVC取值时, 如果发现取值的对象不包含指定的键值,会自动进入对象内部成员进行查找.
三、KVO的使用方式
* KVO 通常用于观察 ” 对象某个属性 ” 发生变化时 , 做出相应的反应 . ( 多用于 观察模型数据 )
* KVO 和通知中心的一个区别 : KVO 只能盯着某个对象 ( 在当前区域内部工作 ), 通知中心可以穿越很多层(如viewController) .
* KVO 使用步骤 :
* 1. [stu addObserver :selfforKeyPath:@"name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"myObserver"];
* 2. observeValueForKeyPath . 当指定键值发生改变时 , 会自动调用这个方法
* 3. removeObserver . 所有观察者模式的性能都不好 , 需要及时移除。
直接上代码:
#import "XNViewController.h" #import "XNPerson.h" #import "XNStudent.h" #import "XNBook.h" @interface XNViewController () @end @implementation XNViewController - (void )viewDidLoad { [super viewDidLoad ]; [self kvcDemo1 ]; [self kvcDemo2 ]; [self kvcDemo3 ]; [self kvcDemo4 ]; [self kvoDemo ]; } - (void )kvoDemo { XNStudent *stu = [[XNStudent alloc ] init ]; stu.name = @"xuneng" ; [stu addObserver : self forKeyPath : @"name" options :NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context : @"myObserver" ]; stu.name = @"neng" ; [stu removeObserver : self forKeyPath : @"name" ]; stu.name = @"xu" ; } - (void )observeValueForKeyPath:( NSString *)keyPath ofObject :( id )object change :( NSDictionary *)change context :( void void *)context { NSLog(@"|-- %@ --|-- %@ --|-- %@ --|-- %@--|" , keyPath, object, change, context); } - (void )kvcDemo 1 { XNPerson *p 1 = [[XNPerson alloc ] init ]; p1 .name = @"xuneng" ; p1 .age = 2 4 ; NSLog(@"KVC1 demo1--> %@" , p 1 ); [p1 setValue : @"xxxx" forKeyPath : @"name" ]; [p1 setValue : @"10" forKeyPath : @"age" ]; NSLog(@"KVC2 demo1--> %@ , %d" , p 1 .name , p 1 .age ); } - (void )kvcDemo 2 { XNStudent *p 1 = [[XNStudent alloc ] init ]; p1 .name = @"student xuneng" ; p1 .age = 2 2 ; NSLog(@"KVC1 demo2--> %@" , p 1 ); [p1 setValue : @"xxxx" forKeyPath : @"name" ]; [p1 setValue : @"10" forKeyPath : @"age" ]; NSLog(@"KVC2 demo2--> %@ , %d" , p 1 .name , p 1 .age ); } - (void )kvcDemo 3 { XNStudent *p 1 = [[XNStudent alloc ] init ]; p1 .name = @"student xuneng" ; p1 .age = 2 2 ; XNBook *myBook = [[XNBook alloc ] init ]; myBook.bookName = @"iOS" ; p1 .book = myBook; NSLog(@"KVC1 demo3--> %@" , p 1 ); [p1 setValue : @"iPhone" forKeyPath : @"book.bookName" ]; NSLog(@"KVC2 demo3--> %@" , p 1 ); } - (void )kvcDemo 4 { XNStudent *p 1 = [[XNStudent alloc ] init ]; p1 .name = @"student1 xuneng" ; p1 .age = 2 4 ; XNBook *myBook 1 = [[XNBook alloc ] init ]; myBook1 .bookName = @"iOS" ; p1 .book = myBook 1 ; XNStudent *p 2 = [[XNStudent alloc ] init ]; p2 .name = @"student2 xuneng" ; p2 .age = 2 3 ; XNBook *myBook 2 = [[XNBook alloc ] init ]; myBook2 .bookName = @"iPhone" ; p2 .book = myBook 2 ; NSArray *arr = @[p 1 , p2 ]; NSMutableArray *arrBook = [[NSMutableArray alloc ] init ]; for ( XNStudent *stu in arr) { [arrBook addObject :stu .book .bookName ]; } NSLog(@"KVC1 demo4--> %@" , arrBook); NSLog(@"KVC2 demo4--> %@" , [arr valueForKeyPath : @"book.bookName" ]); } @end
例子源码下载 :http://download.csdn.net/detail/xn4545945/7571719
转载请注明出处:http://blog.csdn.net/xn4545945