KVC

什么是KVC --->What

KVC指的就是NSKeyValueCoding非正式协议。

KVC是一种间接地访问对象的属性的机制。

这种间接表现在通过字符串来标识属性,而不是通过调用存取方法或直接地访问实例变量的方式。

KVC机制不仅支持对象,还支持标量和结构体类型,这些非对象的类型会被自动的装箱和开箱。

Key & Key Path

键(Key)是一个字符串用来标识对象里面的一个指定的属性。一般一个键对应对象的存取方法或实例变量。键必须是ASCII码,一般以小写字母开始,不能包含空格。

A key path is a string of dot separated keys that is used to specify a sequence of object properties to traverse. The property of the first key in the sequence is relative to the receiver, and each subsequent key is evaluated relative to the value of the previous property.

键路径(Key Path)是一个由点进行分割的一系列键组成的字符串

KVC的使用

- (void)setValue:(id)value forKey:(NSString *)key
- (id)valueForKey:(NSString *)key
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath
- (id)valueForKeyPath:(NSString *)keyPath
- (id)valueForUndefinedKey:(NSString *)key
- (void)setNilValueForKey:(NSString *)key

DEMO

注意:

  • KVC与点语法是正交的,也就是一点关系都没有
  • The accessor patterns are written in the form -set<Key>: or -<key>

KVC在集合中的使用

@avg

NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"];

@count

NSNumber *numberOfTransactions = [transactions valueForKeyPath:@"@count"];

@max

NSDate *latestDate = [transactions valueForKeyPath:@"@max.date"];

@min

NSDate *earliestDate = [transactions valueForKeyPath:@"@min.date"];

@sum

NSNumber *amountSum = [transactions valueForKeyPath:@"@sum.amount"];

什么是KVO

键值观察(Key-value observing)是一种机制。这种机制允许当一个对象的某些属性的值被修改后会通知另外观察该变化的对象。常用于MVC中Model与Controller之间的通信。

如何使用KVO

  1. 注册,指定被观察者的属性
  2. 实现回调方法
  3. 移除观察

常用方法及数据类型说明

// 添加监听对象,并指指定监听的keyPath,以及监听哪些值的变化
- (void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
options参数:
NSKeyValueObservingOptions 说明你要监听什么样的变化:

NSKeyValueObservingOptionNew 属性变化的时候, 只会通知新的值
NSKeyValueObservingOptionOld 属性变化的时候,只会通知旧的数据值
NSKeyValueObservingOptionInitial 当调用添加监听的方法时候,回调方法立即调用,通知初始值
NSKeyValueObservingOptionPrior 取代单次通知,在值变化前和变化后都会调用,比如设置old后,不单单只通知一次, 变化前后会通知两次。 // 移除指定键路径的观察者对象
- (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath // 当监听的属性发生变化后会调用此方法,根据监听option的设置,change的值会存储对应的值
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

注意:必须用set方法, 或者KVC的方法修改属性的值,才会引起KVO通知

For detail, see Introduction to Key-Value Observing Programming Guide

Demo

KVC&&&KVO的更多相关文章

  1. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  2. 【转】 KVC/KVO原理详解及编程指南

    原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...

  3. kvc/kvo复习

    kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...

  4. 转:KVC/KVO原理详解及编程指南

      作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...

  5. 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO

    知识点复习   1. 触摸事件&手势识别   1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加)   附加在某一个特定视图上的, ...

  6. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  7. KVC & KVO

    KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value  Observing的简写,是键值观察的意思.那么我们能拿KV ...

  8. 04 KVC|KVO|Delegate|NSNotification区别

    一. iOS 中KVC.KVO.NSNotification.delegate 在实际的编程中运用的非常多,掌握好他们的运行原理和使用场合对于我们程序的开发将会带来事办工倍的效果:   二. KVC ...

  9. 深入理解 KVC\KVO 实现机制 — KVC

    KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的.但是篇幅有限所以就分成了两篇博文 KVO实现机制传送门 KVC概述 KVC是Key Value Cod ...

随机推荐

  1. scikit-learn 逻辑回归类库使用小结

    之前在逻辑回归原理小结这篇文章中,对逻辑回归的原理做了小结.这里接着对scikit-learn中逻辑回归类库的我的使用经验做一个总结.重点讲述调参中要注意的事项. 1. 概述 在scikit-lear ...

  2. HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48   <audio> 标签属性:src:音乐的URLpreload:预加载au ...

  3. sqoop数据导出导入命令

    1. 将mysql中的数据导入到hive中 sqoop import --connect jdbc:mysql://localhost:3306/sqoop --direct --username r ...

  4. ASP.NET Web API 异常日志记录

    如果在 ASP.NET MVC 应用程序中记录异常信息,我们只需要在 Global.asax 的 Application_Error 中添加代码就可以了,比如: public class MvcApp ...

  5. php isset( $test ) 的神奇之处。

    很久一段时间没更新博客了,由于近段时间一直在忙 挑战杯 的项目,所以没怎样把一些总结放上来.这次,总结下 php 的一个 函数 : boolean isset($test), 返回值:boolean类 ...

  6. Mongodb 数据类型及Mongoose常用CURD

    前言 看完了Node.js实战,其中在数据存储部分提到了Redis.Mongodb,我自己也根据书中的介绍写了几个简单的demo,在demo的过程首先遇到的问题就是数据类型和常见的CURD写法. mo ...

  7. OpenCV2:Mat属性type,depth,step

    在OpenCV2中Mat类无疑使占据着核心地位的,前段时间初学OpenCV2时对Mat类有了个初步的了解,见OpenCV2:Mat初学.这几天试着用OpenCV2实现了图像缩小的两种算法:基于等间隔采 ...

  8. CloudNotes之桌面客户端篇:增强的笔记列表

    今天,我发布了CloudNotes的一个更新版本:1.0.5484.36793.这个版本与1.0.5472.20097不同的是,它拥有增强的笔记列表,与之前单调的列表系统相比,新的笔记列表不仅可以显示 ...

  9. GitHub托管BootStrap资源汇总(持续更新中…)

    Twitter BootStrap已经火过大江南北,对于无法依赖美工的程序员来说,这一成熟前卫的前端框架简直就一神器,轻轻松松地实现出专业的UI效果.GitHub上相关的的开源项目更是层出不穷,在此整 ...

  10. React Native at first sight

    what is React Native? 跟据官方的描述, React Native是一套使用 React 构建 Native app 的编程框架. 推出不久便引发了广泛关注, 这也得益于 Java ...