一、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.[stuaddObserver: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:(voidvoid *)context {
- NSLog(@"|-- %@ --|-- %@ --|-- %@ --|-- %@--|", keyPath, object, change, context);
- }
-
-
-
-
- - (void)kvcDemo1 {
-
- XNPerson *p1 = [[XNPerson alloc] init];
- p1.name = @"xuneng";
- p1.age = 24;
-
- NSLog(@"KVC1 demo1--> %@", p1);
-
-
- [p1 setValue:@"xxxx" forKeyPath:@"name"];
- [p1 setValue:@"10" forKeyPath:@"age"];
- NSLog(@"KVC2 demo1--> %@ , %d", p1.name, p1.age);
- }
-
-
-
-
- - (void)kvcDemo2 {
-
- XNStudent *p1 = [[XNStudent alloc] init];
- p1.name = @"student xuneng";
- p1.age = 22;
-
- NSLog(@"KVC1 demo2--> %@", p1);
-
-
- [p1 setValue:@"xxxx" forKeyPath:@"name"];
- [p1 setValue:@"10" forKeyPath:@"age"];
- NSLog(@"KVC2 demo2--> %@ , %d", p1.name, p1.age);
- }
-
-
-
-
- - (void)kvcDemo3 {
-
- XNStudent *p1 = [[XNStudent alloc] init];
- p1.name = @"student xuneng";
- p1.age = 22;
- XNBook *myBook = [[XNBook alloc] init];
- myBook.bookName = @"iOS";
- p1.book = myBook;
- NSLog(@"KVC1 demo3--> %@", p1);
-
-
- [p1 setValue:@"iPhone" forKeyPath:@"book.bookName"];
- NSLog(@"KVC2 demo3--> %@", p1);
- }
-
-
-
-
- - (void)kvcDemo4 {
- XNStudent *p1 = [[XNStudent alloc] init];
- p1.name = @"student1 xuneng";
- p1.age = 24;
- XNBook *myBook1 = [[XNBook alloc] init];
- myBook1.bookName = @"iOS";
- p1.book = myBook1;
-
- XNStudent *p2 = [[XNStudent alloc] init];
- p2.name = @"student2 xuneng";
- p2.age = 23;
- XNBook *myBook2 = [[XNBook alloc] init];
- myBook2.bookName = @"iPhone";
- p2.book = myBook2;
-
- NSArray *arr = @[p1, 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