//從新整理了下本身原先的博客數組
kvc與kvo函數
1、kvc的概述spa
KVC是KeyValueCoding的簡稱,它是一種能夠直接經過字符串的名字(key)來訪問類屬性(實例變量)的機制。而不是經過調用Setter、Getter方法訪問。server
當使用KVO、Core Data、CocoaBindings、AppleScript(Mac支持)時,KVC是關鍵技術。對象
1>kvc的使用方法繼承
關鍵方法定義在:NSKeyValueCodingprotocolip
KVC支持類對象和內建基本數據類型。rem
關鍵方法定義在:NSKeyValueCodingprotocol字符串
KVC支持類對象和內建基本數據類型。get
獲取值
valueForKey:,傳入NSString屬性的名字。
valueForKeyPath:,傳入NSString屬性的路徑,xx.xx形式。
valueForUndefinedKey它的默認實現是拋出異常,能夠重寫這個函數作錯誤處理。
修改值
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setNilValueForKey:當對非類對象屬性設置nil時,調用,默認拋出異常。
一對多關係成員的狀況
mutableArrayValueForKey:有序一對多關係成員 NSArray
mutableSetValueForKey:無序一對多關係成員 NSSet
例如
Person *p = [Person new];
//使用kvc間接修改對象的屬性時,系統會自動判斷對象屬性的類型,並完成轉換
[p setValue:@"jake" forKey:@"name"];
//NSNumber 基本類型的數據
//NSValue 結構體
[p setValue:@"80" forKey:@"age"];
Person *p1 = [Person new];
//使用kvc間接修改對象的屬性時,系統會自動判斷對象屬性的類型,並完成轉換
[p1 setValue:@"mike" forKey:@"name"];
//NSNumber 基本類型的數據
//NSValue 結構體
[p1 setValue:@"18" forKey:@"age"];
NSLog(@"p = %@ p 1 =%@",p,p1);
NSArray *person = @[p,p1];
NSLog(@"%@",person);
//只生成name的數組
// NSMutableArray *arrayM = [NSMutableArray array];
//kvc按照鍵值路徑取值,若是對象不包含指定的鍵值,會自動進入對象的內部,查找對象屬性
NSArray *array = [person valueForKey:@"name"];
NSLog(@"%@",array);
使用valueForKey:獲取Student對象的name
NSString *name = [student valueForKey:@"name"];
valueForKey:首先查找以name或isName命名的getter方法,若是不存在getter方法,就在對象內部查找名爲_name或name的實例變量
注意,下列語句是合法的
NSLog(@"age is %@", [student valueForKey:@"age"]);
NSLog中的%@輸出一個對象,但age是一個int值,而不是對象,爲何會合理呢?緣由以下:
使用valueForKey:時,KVC會自動將標量值(int、float、struct等)翻入NSNumber或NSValue中包裝成一個對象,而後返回。所以,KVC有自動包裝功能。
鍵路徑(key path)
除了經過鍵設置值外,KVC還支持鍵路徑,像文件系統路徑同樣,其實就是屬性鏈式訪問
好比,利用鍵路徑設置Student對象中Card對象的no
[student setValue:@"12345" forKeyPath:@"card.no"];
獲取Student對象中Card對象的no
[student valueForKeyPath:@"card.no"];
2、kvo的基本概念
Key-Value Observing (KVO) 創建在 KVC 之上,它可以觀察一個對象的 KVC key path 值的變化。舉個例子,用代碼觀察一個 person 對象的 address 變化,如下是實現的三個方法:
1>kvo的使用
watchPersonForChangeOfAddress: 實現觀察
observeValueForKeyPath:ofObject:change:context: 在被觀察的 key path 的值變化時調用。
dealloc 中止觀察
監聽器須要實現監聽方法
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context
keyPath :監聽的屬性
object :誰的屬性改變了
change :屬性改變時傳遞過來的信息(取決於添加監聽器時的options參數)
移除監聽器
-(void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
*/
KVC--KVO--KVB優點
些機制經過規定了一組通用的Cocoa命名法則、調用規則等,實現了以下功能:
1. 使用一對高度規範化的訪問方法,獲取以及設置任何對象的任何屬性的值(所謂的屬性既能夠是個實實在在的成員變量,也能夠是經過一對成員方法所抽象出的該對 象的一個性質)。
2. 經過繼承一個特定的方法,而且指定但願監視的對象及但願監視的屬性名稱,就能在該對象的指定屬性的值發生改變時,獲得一個「通知」(儘管這不是一個真正意 義上的通知),而且獲得相關屬性的值的變化(原先的值和改變後的新值)。
3. 經過一個簡單的函數調用,使一個視圖對象的一個指定屬性隨時隨地都和一個控制器對象或模型對象的一個指定屬性保持同步。