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