利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改)

示例代码:

 示例一:

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

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

// 输出结果都一样

p.dog.name = @"wangcai";

[p.dog setValue:@"laifu" forKey:@"name"];

[p.dog setValue:@"haha" forKey:@"name"];

[p.dog setValue:@"laifu" forKeyPath:@"name"];

[p.dog setValue:@"haha" forKeyPath:@"name"];

// 区别

// forKeyPath包含了forKey的功能, 以后使用forKeyPath

// forKeyPath中可以利用.运算符, 一层一层往下查找对象的属性

//        [p setValue:@"laifu" forKey:@"dog.name"];   // 错误:没有dog.name的key

[p setValue:@"haha" forKeyPath:@"dog.name"];

NSLog(@"%@", p.dog.name);

示例二:

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

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

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

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

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

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

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

示例三: 用于获取值

Book *b1 = [[Book alloc] init];

b1.name = @"iOS";

b1.price = 10.5;

NSLog(@"%@", [b1 valueForKeyPath:@"name"]);

示例四:其他用法

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

Book *b1 = [[Book alloc] init];

b1.name = @"iOS";

b1.price = 10.5;

Book *b2 = [[Book alloc] init];

b2.name = @"Android";

b2.price = 15.5;

Book *b3 = [[Book alloc] init];

b3.name = @"PHP";

b3.price = 12.5;

Book *b4 = [[Book alloc] init];

b4.name = @"前端";

b4.price = 8;

p.books = @[b1, b2, b3, b4];

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

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

NSLog(@"%@", names);

// 利用KVC求和

double sum = [[p valueForKeyPath:@"books.@sum.price"] doubleValue];

// 利用KVC求平均

double average = [[p valueForKeyPath:@"books.@avg.price"] doubleValue];

KVC笔记的更多相关文章

  1. iOS 开发笔记-Objective-C之KVC、KVO

    概述 键值编码(KVC).键值监听(KVO)特性 键值监听KVO Key Value Observing(简称KVO)其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属 ...

  2. Effective Objective-C 读书笔记

    一本不错的书,给出了52条建议来优化程序的性能,对初学者有不错的指导作用,但是对高级阶段的程序员可能帮助不是很大.这里贴出部分笔记: 第2条: 使用#improt导入头文件会把头文件的内容全部暴露到目 ...

  3. 23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory

    23 DesignPatterns学习笔记:C++语言实现 --- 1.1 Factory 2016-07-18 13:03:43 模式理解

  4. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  5. Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础

    结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十七.键值编码 K ...

  6. CoordinatorLayout使用笔记

    CoordinatorLayout的使用笔记 首先第一个子控件是AppBarLayout存放首部控件,里面放了一个CollapsingToolbarLayout.代码如下: <android.s ...

  7. 8 Explicit Animations 指明的动画 笔记

    8 Explicit Animations 指明的动画 笔记     If you want something done right, do it yourself. 如果你想让事情做好,那就自动来 ...

  8. ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

    一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字 ...

  9. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

随机推荐

  1. 静态修饰符(关键字static)

    1.Static修饰的方法或变量通常称为类方法和类属性 2.静态方法中不能使用this和super关键字,也不能做为局部变量使用 3.在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成 ...

  2. C# 正则表达式及返回匹配的所有结果

    C# 正则表达式是在  System.Text.RegularExpressions 空间定义的,其中的 IsMatch() 方法用于返回 bool 类型,表示要搜索的字符串与传入的正则表达式是否匹配 ...

  3. django(五)

    URLs 当一个用户请求一个页面时,Django将按照顺序去匹配每一个模式,并停在第一个匹配请求的URL上. 如果你的url多个正则表达式都能匹配上咋弄?小心出错,这个是按照顺序匹配的 url(r'^ ...

  4. noip2006解题报告

    T1.能量项链 给出一串数字(其实是个环也就是可以旋转).n个数组成n颗珠子,形如: 1 2 3 4 表示的珠子是(1,2)(2,3)(3,4)(4,1) 定义珠子的聚合:如前两颗聚合放出能量为1*2 ...

  5. 一个最小化的SpringBoot项目

    项目结构 项目基于Maven管理,注意使用了父pom <parent> <groupId>org.springframework.boot</groupId> &l ...

  6. 7.arm汇编 bic和orr指令

    1. bic BIC指令的格式为: BIC{条件}{S}  目的寄存器,操作数1,操作数2 BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中. 操作数1应是一个寄存器, 操作数2可以是一 ...

  7. 深入理解JS异步编程二(分布式事件)

    PubSub模式 从原生的js角度,我们要监听某事件的方法就是利用addEventListener方法,但是当我们的页面趋于复杂,比如要向某个元素添加多个处理事件,那么就要用一个封装函数汇集多个处理函 ...

  8. VS2008的DLL项目添加了方法但是找不到怎么办?

      VS2008中建立了一个DLL项目,使用了一段时间后,在其中一个类中添加了一个方法,然后编译后,拷贝了新的.h文件到使用DLL的项目中,并且.dll和.lib也拷贝到了需要的位置,但是在目标项目中 ...

  9. python some install tips

    /* wooyun的小伙伴出了神器. 但是都是打包配置的.我本机又搭建了wamp,不能混合了,那就自己动手丰衣足食咯. */ python 2.7 已经安装. pip https://pip.pypa ...

  10. Linux shell之sed

    sed编辑器逐行处理输入,然后把结果发送到屏幕. -i选项:直接作用源文件,源文件将被修改. sed命令和选项: a\ 在当前行后添加一行或多行 c\ 用新文本替换当前行中的文本 d 删除行 i\ 在 ...