kvc就是鍵值編碼(key-value),說白了就是經過指定的key得到想要的值value。而不是經過調用Setter、Getter方法訪問。*web
一個類中的私有變量,不能直接經過Setter、Getter方法訪問。可是卻能夠經過KVC來訪問。舉例:json
一個類以下:編碼
@interface Dog : NSObject { @private double height; }
這裏的私有變量 height ,假如直接使用Setter、Getter方法訪問,就會出現下面的錯誤。spa
這時候能夠使用KVC來訪問這個私有變量:code
Dog *dog = [[Dog alloc]init]; [dog setValue:@12 forKey:@"height"];//給私有變量賦值 NSLog(@"dog's height is = %@",[dog valueForKey:@"height"]);//讀取私有變量的值
實際使用舉例orm
利用kvc的這個特性,咱們能夠訪問系統裏的一些私有變量。blog
例如:在UIPageControl裏面有兩個私有變量:ci
UIImage* _currentPageImage; UIImage* _pageImage;
咱們能夠經過kvc來進行讀取和賦值:it
UIPageControl *pageControl = [[UIPageControl alloc]init]; //設置值 [pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_currentPageImage"]; [pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_pageImage"]; //讀取值 UIImage *currentImage = [pageControl valueForKey:@"_currentPageImage"]; UIImage *pageImage = [pageControl valueForKey:@"_pageImage"];
這樣咱們就能夠設置當前顯示和未顯示到腳標的樣式了。io
NSArray/NSSet等都支持KVC,這裏舉一個例子:
NSArray *books= @[book1, book2, book3]; NSArray *names = [books valueForKeyPath:@"name"]; NSLog(@"%@", [books valueForKeyPath:@"@avg.price"]);//使用kvc直接打印出來書的平均價格
其中,book是一個書類,有一個屬性是name,一個屬性是price。
// 定義一個字典 NSDictionary *dict = @{ @"name" : @"jack", @"money" : @"20.7", }; // 建立模型 Person *p = [[Person alloc] init]; // 字典轉模型 [p setValuesForKeysWithDictionary:dict]; NSLog(@"person's name is the %@",p.name); }
注意:
(1). key的值必須正確,若是拼寫錯誤,會出現異常
(2). 當key的值是沒有定義的,valueForUndefinedKey:這個方法會被調用,若是你本身寫了這個方法,key的值出錯就會調用到這裏來
(3). 由於類key反覆嵌套,因此有個keyPath的概念,keyPath就是用.號來把一個一個key連接起來,這樣就能夠根據這個路徑訪問下去
(4). NSArray/NSSet等都支持KVC