在OC中,有着很多动态的特性,今天我们着重讲讲OC中的键值编码(KVC)和键值监听(KVO)特性、

一、键值编码(KVC)

  在C#中,我们可以通过反射的方式动态去读写一个对象,有时候很方便,因为可以利用字符串的方法去控制一个对象,其实在OC中,根本不需要任何操作就可以进行属性的动态读写,这个方式就是KVC。

KVC的操作方法由NSKeyValueCoding协议提供的,而NSObject就是实现了这种协议,也就是说OC中的任何对象都支持这种KVC操作,常用的操作如下:

动态设置:

1、setValue:属性值 forKey:属性名

2、setValue:属性值 forKeyPath:属性路径(用于复合路径,例如Person有个Account类型的属性,那么Person.Account就是一个复合属性)

动态读取:

1、valueForKey:属性名

2、valueForKeyPath:属性名

下面通过一个例子理解KVC

Account.h

Account.m

Person.h

Person.m

main.m

执行结果如下:

KVC应该比较简单,那到底他是如何查找一个属性进行读取的呢?假如KVC要对a进行动态读写:

1、如果是动态设置属性,优先考虑setA方法,如果没有该方法则优先搜索成员变量_a,如果仍然不存在则搜索成员变量a,如果最后还是搜索不到,就会调用这个类的setValue:forUndeinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公共的都能设置)

2、如果是动态读取属性,有限考虑a方法,属性a的getter方法,如果没有搜索到则会优先搜索成员变量_a,如果还是不存在则搜索成员变量a,如果还是不存在则会调用这个类的valueforUndefinedKey:方法

二、键值监听KVO

在WPF、Silverlight中有一种双向绑定机制,当数据模型修改了之后,会立即反应到UI视图上,类似的还有前端Web的MVVM框架,例如Knockout.js。其实OC原生就已经支持这种模式,它叫做Key Value Observing(简称KVO),可以理解成观察者模式,利用它很容易实现视图组件和数据模型的分离,当数据模型的属性值变化,会触发组件的自身。在OC中要想实现KVO则要先实现NSKeyValueObServing协议,幸运的是NSObject已经实现了该协议。

在OC中使用KVO常用的方法如下:

1、注册指定Key路径的监听器: addObserver: forKeyPath: options:  context:

2、删除指定Key路径的监听器:removeObserver: forKeyPathremoveObserver: forKeyPath: context:

3、回调监听: observeValueForKeyPath: ofObject: change: context:

使用步骤:

1、通过addObserver: forKeyPath: options: context:为被监听对象(它通常是数据模型)注册监听器

2、重写监听器的observeValueForKeyPath: ofObject: change: context:方法

由于我们还没接触到界面编程,那么我们继续使用上面的例子进行扩展,假如我们希望余额变动的时候,用户可以收到通知,那就是Account就作为我们的被监听对象,需要Person为它注册监听,而人员作为监听器需要重写回调监听事件,以下为模拟这个过程:

Account.h

Account.m

Person.h

Person.m

main.m

在上面的代码中,我们在给人员分配账户时给账户的balance属性添加了监听,并且在监听回调方法中输出了监听到的信息,同时在对象销毁时移除监听,这就构成了一个典型的KVO应用。

07OC之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. KVC&&&KVO

    KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...

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

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

随机推荐

  1. Oracle SQL函数

    Oracle将函数大致分为单行函数,聚合函数和分析函数. 单行函数分为字符函数,日期函数,转换函数,数字函数,通用函数,decode函数 一.字符函数 1)大小写控制函数 01.Lower() 全部小 ...

  2. idea如何设置类头注释和方法注释

    CSDN 2016博客之星评选结果公布      [系列直播]算法与游戏实战技术      "我的2016"主题征文活动 详细:idea如何设置类头注释和方法注释 标签: idea ...

  3. 使用spring方式来实现aop编程

    1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...

  4. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  5. highcharts基本配置和使用highcharts做手机端图标

    使用highcharts三个理由:1>手机适配2>大数据的支持3>svg的优势缺点:不开源.学习资料少 官方有基本的常规用法,一般都是基于jquery写的例子,也可以自己封装函数,用 ...

  6. sql 首写字母查询姓名(字段)

    来自网上大神,不知道是谁,挂不上链接 /////////////////////// 1.生成方法函数 create function f_GetPy(@str nvarchar(4000)) ret ...

  7. LeetCode "419. Battleships in a Board"

    The follow-up question is fun: "Could you do it in one-pass, using only O(1) extra memory and w ...

  8. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  9. 微信小程序之ES6与事项助手

    由于官方IDE更新到了0.11.112301版本,移除了对Promise的支持,造成事项助手不能正常运行,解决此问题,在项目中引入第三方兼容库Bluebird支持Promise,代码已经整合到项目代码 ...

  10. Android开发自学笔记(Android Studio)—4.2TextView及其子类

    一.引言 TextView是我们最常用的一个控件了,它类似于C# Winform程序中的Lable,Java Swing编程中的JLable,不过相对功能更强大些,但从功能上看,它其实就是个文字编辑器 ...