你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> [iOS]KVC 與 KVO

[iOS]KVC 與 KVO

編輯:IOS開發綜合
一、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裡的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


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

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





  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved