一、KVC(key value coding)

我们一般是通过调用set方法或属性的点语法来直接更改对象的状态,即对象的属性值,比如[stu setAge:10];  stu.age = 9;

KVC,它是一种间接更改对象状态的方式,其实现方法是使用字符串来描述对象需要更改的属性。KVC中的基本调用包括valueForKey:和setValue:ForKey:,以字符串的形式向对象发送消息

二、valueForKey

使用valueForKey:获取Student对象的name

NSString *name = [student valueForKey:@"name"];

valueForKey:首先查找以name或isName命名的getter方法,如果不存在getter方法,就在对象内部查找名为_name或name的实例变量

注意,下列语句是合法的

NSLog(@"age is %@", [student valueForKey:@"age"]);

NSLog中的%@输出一个对象,但age是一个int值,而不是对象,为什么会合理呢?原因如下:

使用valueForKey:时,KVC会自动将标量值(int、float、struct等)翻入NSNumber或NSValue中包装成一个对象,然后返回。因此,KVC有自动包装功能。

三、setValue:ForKey

使用setValue:ForKey:设置Student对象的name

[student setValue:@"MJ" forKey:@"name"];

这个方法的工作方式和valueForKey:相同,首先查找setter方法,例如setName:,如果不存在setter方法,就在类中查找名为name或者_name的实例变量,然后为它赋值

使用setValue:ForKey:设置Student对象的age

[student setValue:[NSNumber numberWithInt:17] forKey:@"age"];

在设置一个标量值时,需要先将标量值包装成一个NSNumber或NSValue对象

四、批处理

KVC可以对对象进行批量更改

例如,同时获取Student的age和name

NSArray *keys = [NSArray arrayWithObjects:@"name", @"age", nil];

NSDictionary *dict = [student dictionaryWithValuesForKeys:keys];

同时设置Student的age和name

NSArray *keys = [NSArray arrayWithObjects:@"name", @"age", nil];

NSArray *values = [NSArray arrayWithObjects:@"MJ", [NSNumber numberWithInt:16], nil];

NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];

[student setValuesForKeysWithDictionary:dict];

五、键路径(key path)

除了通过键设置值外,KVC还支持键路径,像文件系统路径一样,其实就是属性链式访问

比如,利用键路径设置Student对象中Card对象的no

[student setValue:@"12345" forKeyPath:@"card.no"];

获取Student对象中Card对象的no

[student valueForKeyPath:@"card.no"];

六、数组的整体操作

如果向一个NSArray请求一个key,KVC会查询数组中的每个对象来查找这个key,然后将查询结果打包到另一个数组中并返回

例如,Student里面有很多Book对象

获取Student中所有Book的name

NSArray *names = [student.books valueForKeyPath:@"name"]; 或者

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

注意:不能在键路径中为数组添加索引,比如@"books[0].name"

七、键路径的运算符

在键路径中,可以引用一些运算符来进行一些运算,例如获取一组值的平均值、最小值、最大值或者总数

例如,计算Student中Book的总数

NSNumber *count = [student.books valueForKeyPath:@"@count"];   或者

NSNumber *count = [student valueForKeyPath:@"books.@count"];

计算Student中所有Book的价钱(price)总和

NSNumber *sum = [student.books valueForKeyPath:@"@sum.price"]; 或者

NSNumber *sum = [student valueForKeyPath:@"books.@sum.price"];

找出Student中Book的所有不同价位(排除相同价位)

NSArray *prices = [student.books valueForKeyPath:@"@distinctUnionOfObjects.price"];

或者

NSArray *prices = [student valueForKeyPath:@"books.@distinctUnionOfObjects.price"];

八、KVO(key value observing)

KVO是一种非常重要的机制,它允许监听对象的属性的变化

注册监听器

-(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context

anObserver :监听器对象

keyPath :监听的属性

options :决定了当属性改变时,要传递什么数据给监听器

监听器需要实现监听方法

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

keyPath :监听的属性

object :谁的属性改变了

change :属性改变时传递过来的信息(取决于添加监听器时的options参数)

移除监听器

-(void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath

iOS基础 - KVC and KVO的更多相关文章

  1. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

  2. iOS开发-KVC和KVO的理解

    KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...

  3. 【iOS】KVC 与 KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的改动或获取对象的属性,减少程序(类与类)之间的耦合度. *"KVO" ...

  4. IOS之KVC和KVO(未完待续)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  5. iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b

    1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...

  6. 【iOS】KVC 和 KVO 的使用场景

    http://blog.csdn.net/chenglibin1988/article/details/38259865   Key Value Coding Key Value Coding是coc ...

  7. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  8. iOS中关于KVC与KVO知识点

    iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点  一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...

  9. [转] iOS (OC) 中 KVC 与 KVO 理解

    转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...

随机推荐

  1. ubuntu14.04通过将语音,耳机没有声音

    真正使用linux每天都有新的发现啊,截至今天上午有一台电脑,听几首歌.后插上耳机中没有声音.我认为这是一个糟糕的耳机,把插在手机耳机,我发现了一个语音耳机,很奇怪,我喜欢计算机接口是不是有问题,是在 ...

  2. Visual Studio Code开发TypeScript

    [Tool] 使用Visual Studio Code开发TypeScript   [Tool] 使用Visual Studio Code开发TypeScript 注意 依照本篇操作步骤实作,就可以在 ...

  3. unity脚本运行顺序具体的解释

    unity脚本自带函数执行顺序例如以下:将以下脚本挂在随意物体执行就可以得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Upd ...

  4. Effective C++ 7

    7.预先准备足够的内存情况. new当内存分配请求无法完成,它会抛出一个异常,怎么办异常,这是一个非常现实的,绝对必要的所遇到的问题后. 于c一般使用宏来分配内存和测试分发成功.c++中产阶级似下面的 ...

  5. React.js终探(五)

    在React中,一切都是看做组件. 而组件的嵌套也是十分常见的. 所以有的组件就作为容器组件 容器组件 React元素可以包含子元素 如 //JSX <ezpanel title="t ...

  6. 使用ArcGIS API for Silverlight实现地形坡度在线分析

    原文:使用ArcGIS API for Silverlight实现地形坡度在线分析 苦逼的研究生课程终于在今天结束了,也许从今以后再也不会坐在大学的课堂上正式的听老师讲课了,接下来的时间就得开始找工作 ...

  7. RPC框架

    RPC框架实现 - 路由控制篇 2015-04-27 22:26 by bangerlee, 499 阅读, 1 评论, 收藏, 编辑 RPC(Remote Procedure Call,远程过程调用 ...

  8. .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧

    原文:.Net 2.0实例学习:WebBrowser页面与WinForm交互技巧 最近看到博客园入门教学文章比较流行,自己最近又偷懒比较多,没啥心得,不妨写一篇没啥深度的入门文章吧. 话说有了WebB ...

  9. 第39届ACM亚洲区域赛牡丹江赛区赛后总结

    2014年10月10日,周五,早晨匆匆忙忙的出了寝室,直奔复印社去打了两份模板,然后直接就去上课了.第三节课下课,直接跟老师讲了一声,就去实验室跟学长们汇合了.12点半,踏上了开往牡丹江的列车,我们那 ...

  10. nexus私服linux搭建问题

    一.最近搭建nexus私服,从官网下载下来总是报503服务器无效,很是无奈,最后在网上找到一个可以用的 收藏起来,这里给大家共享一下 下载地址:http://pan.baidu.com/s/1kT3U ...