Ios KVC KVO
一、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.?所有觀察者模式的性能都不好,需要及時移除。
直接上代碼:
[objc]?view plain?copy?
//??
//??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:(voidvoid?*)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??
轉載于:https://blog.51cto.com/dearleo/1766537
總結
以上是生活随笔為你收集整理的Ios KVC KVO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于盼来了,荣耀 30 系列等 6 款机
- 下一篇: for和while