利用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. JS中数组Array的用法

    js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了. var arr = new Array();  // 初始化数组arr[0] = "aaa";arr[1] = ...

  2. ztree

    http://www.s u c h s o.com/projecteactual/ztree-jiaocheng-mvc-checkbox-quanxuan-demo-down.html http: ...

  3. 天嵌E8卡片电脑USBWIFI驱动linux移植

    下载驱动:http://pan.baidu.com/s/1sjL0Axn The drivers can be downloaded from Ralink website, the present ...

  4. JAVA设计模式之桥梁模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述桥梁(Bridge)模式的: 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式. ...

  5. JS-改变页面的颜色(二)

    需求:点击页面的按钮,改变页面的颜色 思路:一先画出最简单的页面,二想办法获取页面的body节点,三想办法修改body节点的背景颜色属性,四通过一个方法获取随机的颜色值           和第一个例 ...

  6. NDK 的开发流程

    1.NDK开发所需要的工具 windows 需要在windows下的环境 把c代码打包成 手机能用的函数库 首先模拟手机的环境 1 NDK .sh linux 批处理文件 .bat windows 头 ...

  7. ORACLE SQL前端补0的三种方式。

    前端补0的三种方式. select lpad(sal,8,'0') from emp;select to_char(sal,'00000000') from emp;select substr('00 ...

  8. PIC32MZ tutorial -- Watchdog Timer

    Watchdog is a very necessary module for embedded system. Someone said that embedded system operates ...

  9. c++子类调用基类方法的一个例子

        Base.h #pragma once   class Base { public:     Base(void);     ~Base(void);     bool CreatClone( ...

  10. python异常处理、反射、socket

    一.isinstance 判断对象是否为类的实例 n1 = print isinstance(n1,int) class A: pass class B(A): pass b= B() print i ...