在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. Struts2 Ajax校验

    Ajax(Asynchronous javascript and xml):异步刷新技术 技术组成:  CSS + xml +JavaScript +DOM Ajax核心对象: XMLHttpRequ ...

  2. Centos6 服务器病毒查杀命令历史

    top whereis vhowazeclu ll /usr/bin/v* more /usr/bin/vhowazeclu ps aux|grep vhowa ps aux|grep vhowaze ...

  3. nmap报错: Failed to open device ethxxx

    nmap报错:  Failed to open device ethxxx 周银辉 今天用nmap时, 报错:   Failed to open device eth4, 好郁闷. 调查了一下, 是w ...

  4. JavaScript中两种类型的全局对象/函数

    这里所说的JavaScript指浏览器环境中的包括宿主环境在内的. 第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScri ...

  5. asp.net core 部署 提示DataProtectionServices 错误

    今天在部署asp.net core网站时,因为调用到阿里云的api,api的参数需要加密签名,系统报出了如下错误: warn: Microsoft.Extensions.DependencyInjec ...

  6. 十分钟轻松让你认识Entity Framework 7

    EF7不是在EF6上更新,而是完全重写了.它完全支持.NET Core runtime,也就是说以后你可以在Mac或者是Linux机器上使用EF了. https://github.com/nichol ...

  7. 开源任务管理平台TaskManagerV2.0介绍及升级说明

    上一篇开源任务管理平台TaskManager介绍发布后,有网友联系我看看能不能做个后台管理界面,方便管理系统中所有的任务.由于时间和技术问题1.0版本的时候,新增了一个3分钟读取配置文件动态修改任务的 ...

  8. 了解 JS 原型

    原型概念 当创建了一个函数时,就会根据一组特定的规则为该函数创建一个 prototype 属性,这个属性指向函数的原型对象.在默认情况下,所有原型对象都会自动获得一个constructor 的属性 这 ...

  9. CBOW and Skip-gram model

    转自:https://iksinc.wordpress.com/tag/continuous-bag-of-words-cbow/ 清晰易懂. Vector space model is well k ...

  10. [转]Eclipse Debug不为人知的秘密

    原文地址:http://blog.csdn.net/mgoann/article/details/7239492 Debug视图 认识debug视图,红色部分框为线程堆栈视图,黄色部分框为表达式.断点 ...