KVC 與 KVO 理解

KVC 與 KVO 是 Objective C 的關鍵概念,個人認爲必須理解的東西,下面是實例講解。

Key-Value Coding (KVC)

KVC,即是指 Key-Value-Coding鍵值編碼,一個非正式的 Protocol,提供一種機制來間接訪問對象的屬性。KVO 就是基於 KVC 實現的關鍵技術之一。

1、間接訪問

舉個例子,一個Person類有一個內部屬性,私有聲明。

@interface Person : NSObject{
    NSString *_name;
}

@end

這時候外部想要訪問person類的name屬性怎麼辦,難道再聲明一個共有的name嗎,KVO機制就爲我們提供了一個便利的方法。

    Person *person = [[Person alloc]init];
    [person setValue:@"王小明" forKey:@"name"];
    NSLog(@"name:%@",[person valueForKey:@"name"]);

key值對應屬性名,假如我們沒有定義name這個屬性,仍然運行上面幾句代碼就會報錯如下:


提示我們爲一個沒定義的key設置value。這裏注意:區分屬性名任意字母的大小寫,例如Name還有NAME,但是不區分name和_name;


2、鍵路徑訪問屬性

每個Person類都有Card類(身份證)這個屬性,我們想通過person來訪問Card類下的no(身份證號)信息,此時我們應該怎麼做呢

新建一個Card類,.h代碼如下:

#import <Foundation/Foundation.h>

@interface Card : NSObject{
    NSString *_no;
}

@end

Person類.h更改如下:

#import <Foundation/Foundation.h>
@class Card;

@interface Person : NSObject{
    NSString *name;
    Card *card;
}

@end

修改使用方法如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person *person = [[Person alloc]init];
    [person setValue:@"王小明" forKey:@"name"];
    NSLog(@"name:%@",[person valueForKey:@"name"]);
    
    Card *card = [[Card alloc]init];
    [card setValue:@"31415926" forKey:@"no"];
    [person setValue:card forKey:@"card"];
    
    //通過person讀取card的no屬性
    NSString *no = [person valueForKeyPath:@"card.no"];
    no = [[person valueForKey:@"card"] valueForKey:@"no"];//與上句話效果相同
    NSLog(@"no:%@",no);
    
}

結果如下:



key 與 key path 要區分開來,key 可以從一個對象中獲取值,而 key path 可以將多個 key 用點號 “.” 分割連接起來,比如:

[p valueForKeyPath:@"spouse.name"];


相當於這樣:

[[p valueForKey:@"spouse"] valueForKey:@"name"];


3、自動轉換基本數據類型

我們現在爲Person類添加一個int型成員變量age(年齡):

    NSInteger _age;//int類型

我們存取改成員變量:

    [person setValue:@"88" forKeyPath:@"age"];//注意成員變量設置的是int型這裏存進去的是string型
    NSLog(@"age:%@",[person valueForKeyPath:@"age"]);//讀取的也是string


結果如下:


可以看到我們沒做任何類型轉換的前提下,結果正常打印 注意:keyPath可以代替Key來取值,但是Key不能代替keyPath.

4、對集合進行操作(如NSArray)

利用KVC是可以對集合進行操作的,我們爲Person添加一個集合對象如下:

    NSArray *_aryAllPerson;//person組合


往裏面添加三個有年齡的person類然後操作如下:

    //創建數組
    NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:3];
    for (int i = 0; i < 3; i++) {
        Person *person = [[Person alloc]init];
        [person setValue:[NSString stringWithFormat:@"%d",10*i + 30] forKey:@"age"];
        [array addObject:person];
    }
    //操作集合對象
    [person setValue:array forKey:@"aryAllPerson"];
    NSLog(@"各人的年齡:%@",[person valueForKeyPath:@"aryAllPerson.age"]);
    NSLog(@"總共%@各人",[person valueForKeyPath:@"aryAllPerson.@count"]);
    NSLog(@"最高成績:%@", [person valueForKeyPath:@"[email protected]"]);
    NSLog(@"最低成績:%@", [person valueForKeyPath:@"[email protected]"]);
    NSLog(@"平均成績:%@", [person valueForKeyPath:@"[email protected]"]);

可以添加可變數組也可以添加不可變數組,打印結果如下:


到此爲止KVC相關語法介紹完畢,希望對大家有所幫助,下面我們來看看KVO

Key-Value Observing (KVO)


實際上是一種鍵值觀察機制,比如我們可以爲view添加一個觀察者觀察他所有屬性


發佈了49 篇原創文章 · 獲贊 15 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章