在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. NYOJ 70

    描述:给定两个数n,m,其中m是一个素数. 将n(0<=n<=2^31)的阶乘分解质因数,求其中有多少个m. 注:^为求幂符号. 输入: 第一行是一个整数s(0<s<=100) ...

  2. c语言游戏推箱子

    前两天做了推箱子小游戏,看似简单的一个小游戏背后却 有巨大的秘密,这秘密就是一大堆逻辑. 自从学习了函数过后,的确是解决了很多问题,而且调用很方便,尽管我现在都不是很会调用. 写完一个函数,准备测试一 ...

  3. WebApi 接口参数不再困惑:传参详解

    阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.后台发送请求参数的 ...

  4. 第一章,阿里的Dubbo完美初级搭建,待续。。。

    1.1 后台工程搭建分析 Web工程. Maven的常见打包方式:jar.war.pom Pom工程一般都是父工程,管理jar包的版本.maven插件的版本.统一的依赖管理.聚合工程. Taotao- ...

  5. [转]Hibernate延迟加载与opensessioninviewFilter

    原文地址:http://blog.csdn.net/a19881029/article/details/7916702 hibernate延迟加载: 一个person对应多个school,使用hibe ...

  6. 利用python合并两个文件

    1格式如下 在做利用zabbix的api来批量添加主机的时候,需要处理ip和hostname,在借用别人写的py程序的基础上,自己有改装了以下脚本,为自己使用.需要时ip和hostname为一个统一格 ...

  7. python 中文乱码问题

    解决方案: 1.py文件另存为ANSI文件 2.py文件头部加注释 # -*- coding:utf-8 -*-

  8. DevExpress.chartContro控件保存图片和打印图片

    private void pictureBox1_Click(object sender, EventArgs e) { ////实例化打印对象 PrintDocument print = new P ...

  9. Web Analytics 2.0 中文翻译 [ 系列索引 ]

    引言 内容概述 第一章:网站分析2.0的新奇世界 第二章:选择你的网络分析灵魂伴侣的最佳策略 第三章:点击流分析的奇妙世界:指标 第四章:点击流分析的奇妙世界:实际的解决方案 第五章:荣耀之钥:度量成 ...

  10. Zabbix监控nginx status

    nginx开启status ./configure --with-http_stub_status_module nginx.conflocation /statusx35 { stub_status ...