KVO与KVC学习笔记

一、KVC的基本概念

Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制,而不是直接调用getter 和 setter方法。通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法。

下面是使用KVC 和 不使用 KVC的代码对比

Persion *persion = [ [Persion alloc] init ];
//不使用KVC
persion.name = @”hufeng” ;
//使用KVC的写法
[persion setValue:@”hufeng” forKey:@”name”];

下面举个复杂点的例子:我们有一个人 这个人有一个手机类 这个手机类 有一个电池类 我们要获取这个电池类 比之前复杂了吧。
没有KVC

Persionpersion = [ [Persion alloc] init ];
Phone
phone = persion.phone;
Battery*battery = phone.battery;

使用KVC

Battery *battery = [persion valueForKeyPath: @”phone.battery” ];

注意:valueForKeyPath 里面的值是区分大小写的,你如果写出Phone.Battery 是不行的

二、KVC与属性合成存取方法的区别

KVC 不但能够赋值,而且还能破坏属性值的只读特性。更重要的是KVC 有自动装箱(自动类型转换)的功能,我们不需要去转换类型了。由于开发过程中数据领域是字符串的天下,所以这个自动装箱的功能的确是极好的。

例子KVC1

从上可以看出 ,KVC绕过了属性的attribute设置,可以给只读属性值赋值,也可以给NSNumber赋字符串;

三、支持键值路径

什么叫支持键值路径?说白了就是支持嵌套。假如现在有一个书籍类,类中包含了书籍的名称name。书籍可以被Person所拥有(就是可以作为person的属性)

kvc2;

这里的key直接使用点局分开就好了,注意一下:这里使用的时keyPath,当然在 二、KVC与属性合成存取方法的区别 中我们也可以使用keyPath,只不过再不必要的情况下使用keyPath会浪费性能而已。

四、支持操作符

假如我们有10个字符串,我们想求出这10个字符串的总长度,我们可以使用KVC提供的操作符。

NSArray *books=@[@”鸟哥烧烤私房菜”,@”程序员摊煎饼宝典”,@”麻辣烫基础教程”];
NSLog(@”%@”,[books valueForKeyPath:@”@sum.length”]);

这里的@sum 是KVC 提供的,不是我们写的。像这样的函数共有5个@avg,@count,@max,@min,@sum。我们直接用就可以了。但是据说效率比用for循环慢。我没有测试过,感兴趣的话你可以测试一下。

热评文章