[iOS]KVC 與 KVO

來源:互聯網
上載者:User

一、KVC與KVO
*“KVC”:key value Coding(索引值編碼) *目的:間接的修改或擷取對象的屬性,降低程式(類與類)之間的耦合度.
*“KVO”:key value Observer(索引值觀察),觀察者模式.(檢測模型變化用的多) *目的:通常用於觀察某個對象的某個屬性發生變化時,及時做出相應.
二、KVC的使用方式

KVC被稱為iOS開發平台的大招!!! 能快速修改對象屬性。

*[p1setValue:@“xxxx”forKeyPath:@“name”];修改指定對象屬性. *[arrvalueForKeyPath:@“book.bookName”]; 擷取對象屬性. *KVC通過鍵能直接取得數組. *在使用KVC時, 一定要保證索引值是存在的. *原理: KVC取值時, 如果發現取值的對象不包含指定的索引值,會自動進入對象內部成員進行尋找.
三、KVC的使用方式
*KVO通常用於觀察”對象某個屬性”發生變化時,做出相應的反應.(多用於觀察模型資料) *KVO和通知中樞的一個區別 : KVO只能盯著某個對象(在目前範圍內部工作),通知中樞可以穿越很多層(如viewController). *KVO使用步驟: *1.[stuaddObserver:selfforKeyPath:@"name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"myObserver"]; *2.observeValueForKeyPath. 當指定索引值發生改變時, 會自動調用這個方法 *3.removeObserver. 所有觀察者模式的效能都不好,需要及時移除。
直接上代碼:
////  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裡的bookNameNSLog(@"KVC2 demo3--> %@", p1);}/** *擷取對象的屬性值. 可批量擷取(如果是數組的話). */- (void)kvcDemo4 {XNStudent *p1 = [[XNStudent alloc] init]; //學生1p1.name = @"student1 xuneng";p1.age = 24;XNBook *myBook1 = [[XNBook alloc] init];myBook1.bookName = @"iOS";p1.book = myBook1;XNStudent *p2 = [[XNStudent alloc] init]; //學生2p2.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


例子源碼下載:http://download.csdn.net/detail/xn4545945/7571719

轉載請註明出處:http://blog.csdn.net/xn4545945





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.