一、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. 解决 configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL

    当安装configure.ac:17: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are le ...

  2. crontab 里不能运行expdp

    编辑脚本 xxx.sh #!/bin/shrq=`date +%Y%m%d`filename="test$rq"expdp system/*** directory=expdump ...

  3. 从头开始学JavaScript (十)——垃圾收集

    原文:从头开始学JavaScript (十)--垃圾收集 一.垃圾收集 1.1javascript垃圾收集机制: 自动垃圾收集,执行环境会负责管理代码执行过程中的使用的内存.而在C和C++之类的语言中 ...

  4. MessageDigest简要

    本文博客原 參考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 一.概述 java.security.MessageDigest类用于为 ...

  5. Matlab splinetx

    function v = splinetx(x,y,u) %SPLINETX Textbook spline function. % v = splinetx(x,y,u) finds the pie ...

  6. elasticsearch的rest搜索---mapping

    目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 三.mapping 1. 索引的map ...

  7. Android学习----异常(2):Please ensure that adb is correctly located at ' ... '

    打开任务管理器,在后台进程中找到 kadb,结束这个进程,重新启动eclipse.

  8. JavaScript闭包的一些理解

    原文:JavaScript闭包的一些理解 简单一点的说:闭包就是能够读取其他函数内部变量的函数.那如何实现读取其它函数内部变量呢,大家都知道在JavaScript中内部函数可以访问其父函数中的变量,那 ...

  9. java学习笔记2——Eclipse的安装及汉化图解

    Eclipse的安装 有了JDK,你可以编译Java源码,运行Java程序,但是还没有代码编辑器,没有版本管理工具,也不能方便的管理工程文件,不能与团队协作.安装Eclipse,你才能完成这些工作. ...

  10. JavaScript-RegExp对象仅仅能使用一次

    下面的代码,是測试从字符串中识别出年月日,能够看到创建的rYMD这个RegExp对象运行了一次后,又运行了一次. var DateStr = "2014-9-8"; var rYM ...