• KVC是Cocoa一个大招,非常牛逼。
  • 利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改) 
    如:Person.m文件中:
@implementation Person
{
    @private
    double _height;
}

- (void)printHeight
{
    NSLog(@"height是%f", _height);
}

@end
 

Person.h中:

- (void)printHeight;
 

看我们如何修改这个height的值:

void test()
{
    Person *p = [[Person alloc] init];

[p setValue:@10.5 forKey:@"height"];
    [p printHeight];

}
 

就这样就能更改了这个height的值。


forKeyPath中可以利用.运算符, 就可以一层一层往下查找对象的属性 
当然 在一般的修改一个对象的属性的时候,forKey和forKeyPath,没什么区别。如:

            [p setValue:@"jack" forKey:@"name"];

            [p setValue:@30 forKey:@"age"];
 
            [p setValue:@"jack" forKeyPath:@"_name"];

            [p setValue:@30 forKeyPath:@"_age"];
 

一样能修改这个name和age的值。

  • 看一下若是层次结构深一点的。比如person 有dog;dog有bone 
    这个是dog的属性:
@class Bone;

@interface Dog : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) Bone *bone;

@end
 

这个是bone的属性:

@interface Bone : NSObject
@property (nonatomic, strong) NSString *type;

@end
 

我们先初始化这些对象:

    Person *p = [[Person alloc] init];
    p.dog = [[Dog alloc] init];

    p.dog.bone = [[Bone alloc] init];
 

然后接下来我们给这个bone赋值:

            p.dog.bone.type = @"狗骨";

[p setValue:@"猪骨" forKeyPath:@"dog.bone.type"];
            [p.dog setValue:@"猪骨" forKeyPath:@"bone.type"];

    [p.dog.bone setValue:@"猪骨" forKeyPath:@"type"];
 
  • 从这里我们可以看出,这个forKeyPath的厉害,能使用点语法,深层次的去寻找我们需要的属性
  • 我们看一下取值的时候,forKeyPath:
void test()
{
    Person *p = [[Person alloc] init];
    p.dog = [[Dog alloc] init];
    p.dog.bone = [[Bone alloc] init];

}
 
  • 获得数组中的每一个元素的某个属性值

比如person有很多书:

 Person *p = [[Person alloc] init];

Book *book1 = [[Book alloc] init];
        book1.name = @"ios之Ui布局";
        book1.price = 10.5;

Book *book2 = [[Book alloc] init];
        book2.name = @"ios之OC基础";
        book2.price = 18.5;

Book *book3 = [[Book alloc] init];
        book3.name = @"ios之多线程";
        book3.price = 20.5;

Book *book4 = [[Book alloc] init];
        book4.name = @"ios之内存管理";
        book4.price = 10.5;

        p.books = @[book1, book2, book3, book4];
 

然后我们取出books数组中每一个元素的name属性值,放到一个新的数组中返回

        NSArray *names = [p valueForKeyPath:@"books.name"];
 

这样就能办到。 
还有一个比较牛逼的 是取得一些特殊的值,如:avg、sum

        NSNumber *avgNumber = [p valueForKeyPath:@"books.@avg.price"];

        NSNumber *sumNumber = [p valueForKeyPath:@"books.@sum.price"];
 
 
所以以后我们就用forKeyPath就行了。因为这个更强大。 

KVC(forKey,forKeyPath)的更多相关文章

  1. 使用KVC

    KVC是Key Value Coding的简称,意思是键值编码,号称Cocoa的大招.它是一种可以直接通过字符串key(对象在名称)来访问或修改对象属性的机制. 使用 1.利用KVC可以随意修改一个对 ...

  2. IOS开发之KVC与KVO简述

    KVC:Key-Value Coding KVO:Key-Value Observing Person.m #import <Foundation/Foundation.h> @inter ...

  3. iOS:KVO/KVC 的概述与使用

    iOS:KVO/KVC 的概述与使用       KVO   APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性 ...

  4. iOS KVO & KVC

    键值观察:值更改时通知观察者 键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性.该属性值改变时,会通知观察对象.它了解新值以及旧值:如果观察的属性为对多的 ...

  5. iOS编程——Objective-C KVO/KVC机制[转]

    这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1.     1 ...

  6. KVC与KVO的不同

    vc 就是一种通过字符串去间接操作对象属性的机制,  访问一个对象属性我们可以 person.age  也可以通过kvc的方式   [person valueForKey:@"age&quo ...

  7. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  8. iOS编程——Objective-C KVO/KVC机制

    来源:http://blog.sina.com.cn/s/blog_b0c59541010151s0.html 这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结 ...

  9. 从[id setValue: forKey:]了解KVC

    <Objective-C基础教程> P224页有详细介绍 下边是apple官网的简单介绍 和一个应用的例子. KVC就是Key-value coding,大意是允许通过一个Key来读写一个 ...

随机推荐

  1. 收集前端UI框架 持续更新中....

    1. elementUI 饿了么出品 基于Vue2 http://element.eleme.io/#/zh-CN 2. ZUI 开源HTML5跨屏框架  (2018年1月4日更新)一个基于 Boot ...

  2. 【java基础】java关键字final

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  3. Javascript模块化编程require.js的用法

    JS模块化工具requirejs教程(一):初识requirejs http://www.runoob.com/w3cnote/requirejs-tutorial-1.html JS模块化工具req ...

  4. String.valueof;和String = ""+1;的区别

    关于字符串的+操作,单纯的String  s ="" +11;编译器会看做常量""和常量11的拼接操作,常量计算最快:String.valueOf会调用方法,速 ...

  5. 蚂蚁金服 Service Mesh 实践探索

    SOFAMesh是蚂蚁金服在ServiceMesh方向上的探索,下面是它高级技术专家敖小剑在QCon上海2018上的演讲. Service Mesh 是一个 基础设施层,用于处理服务间通讯.现代云原生 ...

  6. Hive之 hive与hadoop的联系

    Hive与Hadoop调用图 解析: 1.提交sql 交给驱动2.驱动编译:解析相关的字段表信息3.去metastore查询相关的信息 返回字段表信息4.编译返回信息 发给驱动5.驱动发送一个执行计划 ...

  7. bzoj1037生日聚会

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1037 任意区间的话,可以从所有后缀区间考虑. 因为每一个区间一定是某一时刻的一个后缀区间,所 ...

  8. 解决 eclipse tomcat cannot create a server using the selected type

    解决的方法 1.退出eclipse: 2.打开 [工程目录下]/.metadata/.plugins/org.eclipse.core.runtime/.settings目录: 3.删除org.ecl ...

  9. Linux Namespace

    转载请注明出处,并保留以上所有对文章内容.图片.表格的来源的描述. 一.Linux Namespace Linux Namespace是Linux提供的一种OS-level virtualizatio ...

  10. SQL2008如何清空压缩数据库日志

    SQL2008如何清空压缩数据库日志 编写人:左丘文 2015-4-10 近期在给一系统初始化资料时,不断的导入导出,因此一不小心,就将数据的SQL(sql2008R2)的是日志档弄得比数据库还大,给 ...