KVC

一、KVC

KVC就是key-Value-coding,即键值编码,通常情况给某一个对象进行赋值。但是通常赋值操作直接使用点语法即可,简单方便,例如:

Person *p = [[Person alloc]init];
p.name = @"张三";
p.age = 20;`

我们也可以通过KVC给p赋值,代码如下,因为setValue这里的值是id类型的,所以将整数包装成一个对象,

[p setValue:@"张三" forKey:@"name"];
[p setValue:@20 forKey:@"age"];

我们为什么不用点语法这样简单的操作进行赋值操作,而要使用KVC呢?
比如Person类有一个私有属性,并且对外提供一个输出私有属性值的接口,例如:

#import "Person.h"
@impletation Person
{
      NSInteger _height;
}    

- (void)logHeight
{
     NSLog(@"%ld",_height);
}

这样的情况,我们在外部是无法直接给p设置身高的,外部无法访问到私有属性,但是有了KVC就不一样了。

[p setValue:@170 forKey:@"height"];
[p logHeight];

我们在外部通过KVC直接对私有属性赋值,打印如下:

 2016-11-03 17:42:27.174 KVODemo[1246:41973] 170

除了[p setValue:@170 forKey:@"height"]这个方法外,还有一个方法可以对私有属性赋值:
[p setValue:@170 forKeyPath:@"height"]

这两个方法对于普通的属性是没有区别的,都可以用,但是对一些特殊的属性就有区别了。
比如说这个类又个属性是狗,狗又有属性体重:

p.dog = [[Dog alloc] init];
[p setValue:@200 forKey:@"dog.weight"];

如果我们直接这样设置是会报错说找不到dog.weight,而在storyboard中,我们拖控件连线错误的时候报错也说找不到什么key,说明storyboard在赋值的时候也是通过KVC来操作的。

但是,我们换另外一种方法,不会报错,而且可以打印出狗的体重。

[p setValue:@200 forKeyPath:@"dog.weight"];

说明forKeyPath是包含了forKey这个方法的功能的,甚至 forKeyPath方法还有它自己的高级功能,它会先去找有没有dog这个key,然后去找有没有weight这个属性。所以在使用KVC的时候,最好使用 forKeyPath这个方法。

最后还有一点,代码如下:

[p setValue:@170 forKey:@"height"];

我们传入的字符串key是height,但是定义的属性是 _heigth,但是通过kvc还是可以给 _height属性赋到值。说明对某一属性进行赋值操作,可以不用加下划线,而且它的查找规则应该是:先查找与写入字符转相同的成员变量,如果找不到就找以下划线开头的成员变量。

KVC除了访问私有变量的作用外,还可以用于字典转模型。在Person类对外提供一个接口,将转模型的工作放在模型中进行

- (instancetype)initWithDict:(NSDictionary *)dict
{
    if(self = [super init]) {
         [self setValueForKeysWithDictionary:dict];
      }
      return self;
}
kvc用法总结
* 1.在外部对私有变量进行赋值
* 2.字典转模型
注意
* 1.字典转模型的时候,字典的某一个key一定要在模型中有对应的属性
* 2.如果模型中包含了另外的模型对象,是不能直接转化成功的。
* 3.通过kvc转化模型中的模型,也是不能直接转换成功的。

既然可以通过kvc赋值,也可以通过它取值:

NSLog(@"name=%@",[p valueForKey:@"name"]);
NSLog(@"dogWeight=%@",[p valueForKeyPath:@"p.dog"]);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    朽木自雕也阅读 1,552评论 6 1
  • KVC(Key-value coding)键值编码,iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,...
    CALayer_Sai阅读 2,515评论 0 4
  • KVC kvc全称key-value-coding(键值编码),通常是用来给某一个对象的属性进行赋值,比如有一个p...
    珍此良辰阅读 329评论 0 3
  • KVC简单介绍 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key...
    公子无礼阅读 1,383评论 0 6
  • KCV 其实由于ObjC的语言特性,你根部不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value...
    TYM阅读 1,053评论 0 4