KVC(forKey,forKeyPath)
- KVC是Cocoa一个大招,非常牛逼。
- 利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改)
如:Person.m文件中:
@implementation Person
{
@private
double _height;
}
- (void)printHeight
{
NSLog(@"height是%f", _height);
}
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:@"jack" forKeyPath:@"_name"];
一样能修改这个name和age的值。
- 看一下若是层次结构深一点的。比如person 有dog;dog有bone
这个是dog的属性:
@class Bone;
@interface Dog : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) Bone *bone;
这个是bone的属性:
@interface Bone : NSObject
@property (nonatomic, strong) NSString *type;
我们先初始化这些对象:
Person *p = [[Person alloc] init];
p.dog = [[Dog alloc] init];
然后接下来我们给这个bone赋值:
p.dog.bone.type = @"狗骨";
[p setValue:@"猪骨" forKeyPath:@"dog.bone.type"];
[p.dog setValue:@"猪骨" forKeyPath:@"bone.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;
然后我们取出books数组中每一个元素的name属性值,放到一个新的数组中返回
NSArray *names = [p valueForKeyPath:@"books.name"];这样就能办到。
还有一个比较牛逼的 是取得一些特殊的值,如:avg、sum
NSNumber *avgNumber = [p valueForKeyPath:@"books.@avg.price"];
KVC(forKey,forKeyPath)的更多相关文章
- 使用KVC
KVC是Key Value Coding的简称,意思是键值编码,号称Cocoa的大招.它是一种可以直接通过字符串key(对象在名称)来访问或修改对象属性的机制. 使用 1.利用KVC可以随意修改一个对 ...
- IOS开发之KVC与KVO简述
KVC:Key-Value Coding KVO:Key-Value Observing Person.m #import <Foundation/Foundation.h> @inter ...
- iOS:KVO/KVC 的概述与使用
iOS:KVO/KVC 的概述与使用 KVO APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性 ...
- iOS KVO & KVC
键值观察:值更改时通知观察者 键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性.该属性值改变时,会通知观察对象.它了解新值以及旧值:如果观察的属性为对多的 ...
- iOS编程——Objective-C KVO/KVC机制[转]
这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1. 1 ...
- KVC与KVO的不同
vc 就是一种通过字符串去间接操作对象属性的机制, 访问一个对象属性我们可以 person.age 也可以通过kvc的方式 [person valueForKey:@"age&quo ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- iOS编程——Objective-C KVO/KVC机制
来源:http://blog.sina.com.cn/s/blog_b0c59541010151s0.html 这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结 ...
- 从[id setValue: forKey:]了解KVC
<Objective-C基础教程> P224页有详细介绍 下边是apple官网的简单介绍 和一个应用的例子. KVC就是Key-value coding,大意是允许通过一个Key来读写一个 ...
随机推荐
- 征信接口调用,解析(xml)
数据传输格式报文格式:xml public CisReportRoot queryCisReport(PyQueryBean pyQueryBean) throws Exception { CisRe ...
- java 注解总结
@Controller用于标注控制层组件 @Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象.分发处理器将会扫描使用了该注解的类的方法.通 ...
- Java第二次作业--数组和String类
Deadline: 2017-3-28 23:00 一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握基本数据类型和引用数据类型的区别 理解对象的生成与引用的关系 掌握构造方法的重载 掌握St ...
- jqGrid使用json实现的范例一
qGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信.文档比较全面,其官方网址为:http://www.trirand.com. ...
- 进程的proc文件系统信息
一.实验代码 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include &l ...
- 基于http协议的加密传输方案
最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现.既然不能用https协议,那就退而求其次采用http协议吧! 那么问题来了!在对接的过 ...
- 【转】Vim自动补全插件----YouCompleteMe安装与配置
原文网址:http://www.cnblogs.com/zhongcq/p/3630047.html 使用Vim编写程序少不了使用自动补全插件,在Linux下有没有类似VS中的Visual Assis ...
- ruby里面的毒瘤
转自https://ruby-china.org/topics/26120 由于ruby的灵活性,如何很好的使用,其实是比较有技巧的,其实总结起来,可以大概归类如下 常规业务,不到万不得已,不使用元编 ...
- CI 框架怎么去掉隐藏入口文件 index.php
当我重新接触一个框架的时候首先肯定要去掉入口文件,也就是index.php 这个东西在url上很不漂亮,而且每次我访问我的网站的时候都要打进去url里面.这样告诉一个去掉 CI框架里面入口文件的方法, ...
- "废物利用"也抄袭——“完全”DIY"绘图仪"<二、下位机程序设计>
就不说怎么组装了吧,一把辛酸泪.说程序,因为这有两把辛酸泪……一把给下位机的C代码一把为了VB.NET的图像处理……不过就上上一篇说的,它们可以正确运行了,并且今天克服了Arduino上电过程中步进电 ...