KVC被稱為iOS開發平台的大招!!! 能快速修改對象屬性。
*[p1setValue:@“xxxx”forKeyPath:@“name”];修改指定對象屬性. *[arrvalueForKeyPath:@“book.bookName”]; 獲取對象屬性. *KVC通過鍵能直接取得數組. *在使用KVC時, 一定要保證鍵值是存在的. *原理: KVC取值時, 如果發現取值的對象不包含指定的鍵值,會自動進入對象內部成員進行查找.// // XNViewController.m // KVC----KVO // // Created by neng on 14-6-21. // Copyright (c) 2014年 neng. All rights reserved. // #import "XNViewController.h" #import "XNPerson.h" #import "XNStudent.h" #import "XNBook.h" @interface XNViewController () @end /** * KVC: Key Value Coding(鍵值編碼) * 間接修改/獲取對象的屬性, 降低類與類之間的耦合度. * KVO: Key Value Observer(鍵值觀察) KVO通常用於觀察”對象的某個屬性“發生變化時,及時做出響應! 而NSNotificationCenter是需要POST"通知字符串"(表示監聽的事件類型)的對象存在,通知中心才能夠工作! */ @implementation XNViewController - (void)viewDidLoad { [super viewDidLoad]; //1.簡單的修改對象屬性 [self kvcDemo1]; //2.對於子類, 也能直接修改 [self kvcDemo2]; //3.修改對象的book屬性. (相當麻煩, 好要創建book對象).KVC一句話 [self kvcDemo3]; //4.獲取對象的屬性值. 可批量獲取(如果是數組的話). [self kvcDemo4]; //KVO 演示 [self kvoDemo]; } - (void)kvoDemo { XNStudent *stu = [[XNStudent alloc] init]; stu.name = @"xuneng"; //設置監聽對象 //1》 負責觀察的對象 self //2》 觀察的鍵值路徑 //3》 觀察的選項 //4》 上下文:通常用於區分不同的觀察事件 [stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"myObserver"]; stu.name = @"neng"; //修改 //所有觀察者模式的性能都不好, 需要及時移除 [stu removeObserver:self forKeyPath:@"name"]; stu.name = @"xu"; //移除後再次修改 } /** 當KVO指定的對象鍵值發生改變時, 會自動調用該方法 name: 觀察的鍵值 object: 觀察的對象 change: 修改的字典(新舊數值) context: 指定觀察者時傳入的上下文 */ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"|-- %@ --|-- %@ --|-- %@ --|-- %@--|", keyPath, object, change, context); } /** *簡單的修改對象屬性 */ - (void)kvcDemo1 { //1.原始的方式. 點語法修改對象屬性的值 XNPerson *p1 = [[XNPerson alloc] init]; p1.name = @"xuneng"; p1.age = 24; // NSLog(@"%@ , %d",p1.name,p1.age); NSLog(@"KVC1 demo1--> %@", p1); //這樣直接調用description方法. //2.KVC來修改 [p1 setValue:@"xxxx" forKeyPath:@"name"]; [p1 setValue:@"10" forKeyPath:@"age"]; NSLog(@"KVC2 demo1--> %@ , %d", p1.name, p1.age); } /** *對於子類, 也能直接改 */ - (void)kvcDemo2 { //1.傳統方法 XNStudent *p1 = [[XNStudent alloc] init]; //學生 p1.name = @"student xuneng"; p1.age = 22; // NSLog(@"%@ , %d",p1.name,p1.age); NSLog(@"KVC1 demo2--> %@", p1); //這樣直接調用description方法. //2.KVC來修改子類 [p1 setValue:@"xxxx" forKeyPath:@"name"]; [p1 setValue:@"10" forKeyPath:@"age"]; NSLog(@"KVC2 demo2--> %@ , %d", p1.name, p1.age); } /** *修改對象的book屬性. (相當麻煩, 好要創建book對象).KVC一句話 */ - (void)kvcDemo3 { //1.傳統方法 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); //2.KVC的方法 [p1 setValue:@"iPhone" forKeyPath:@"book.bookName"]; //學生裡的book,book裡的bookName NSLog(@"KVC2 demo3--> %@", p1); } /** *獲取對象的屬性值. 可批量獲取(如果是數組的話). */ - (void)kvcDemo4 { XNStudent *p1 = [[XNStudent alloc] init]; //學生1 p1.name = @"student1 xuneng"; p1.age = 24; XNBook *myBook1 = [[XNBook alloc] init]; myBook1.bookName = @"iOS"; p1.book = myBook1; XNStudent *p2 = [[XNStudent alloc] init]; //學生2 p2.name = @"student2 xuneng"; p2.age = 23; XNBook *myBook2 = [[XNBook alloc] init]; myBook2.bookName = @"iPhone"; p2.book = myBook2; NSArray *arr = @[p1, p2]; //1.普通方法獲取數組中對象的屬性 NSMutableArray *arrBook = [[NSMutableArray alloc] init]; for (XNStudent *stu in arr) { [arrBook addObject:stu.book.bookName]; } NSLog(@"KVC1 demo4--> %@", arrBook); //2.KVC方法來獲取數組中對象 NSLog(@"KVC2 demo4--> %@", [arr valueForKeyPath:@"book.bookName"]); } @end