KVC , KVO , KVB

简介:

来源:http://www.cnblogs.com/jay-dong/archive/2012/12/13/2815778.html

熟悉oc语法的同学也许都会懂得这么一点:在oc中,类的成员变量或是方法是没有绝对私有的。

私有方法直接通过类实例无法访问,但可以借助oc的“编译运行时”机制,也即“瞎子摸黑”机制(个人理解:只要确定了该类有方法A,管你是私有共 有,我用performSelector函数就能调用你),说到这,也许有同学会自然想起,那私有变量如何去访问呢?貌似以前还真没这样搞过,然而现实是 可以的,只不过一般我们把变量设为类的私有变量后是不希望自己或是其他人再去访问的,不然我只能说你自己又在找贱了。。。。。。。。。。。。。。

好吧,言归正传,这篇文章主要是想介绍下oc中的KVC、KVO、KVB的实现机制,当然跟我上面说的那些肯定是有关系的啦。。

1. KVC:  key-value coding(键值编码)

它 是一种使用字符串标识符,间接访问对象属性的机制,它是很多技术的基础。主要的方法就两对方法: (setValue:forKey,valueForKey)、setValue:forKeyPath,valueForKeyPath);这个东西有 什么作用呢,我先不说原理,先说怎么用,例子如下:

@interface A { NSString* foo; }
 ... // 其它代码
 @end
@interface B { NSString* bar; A* myA; }
 ... // 其它代码
@end
@implementation B
... // 假设 A 类型的对象 a,B 类型的对象
 b A* a = ...;
 B* b = ...;
 NSString* s1 = [a valueForKey:@"foo"]; // 正确
 NSString* s2 = [b valueForKey:@"bar"]; // 正确
 NSString* s3 = [b valueForKey:@"myA"]; // 正确
 NSString* s4 = [b valueForKeyPath:@"myA.foo"]; // 正确
 NSString* s5 = [b valueForKey:@"myA.foo"]; // 错误
 NSString* s6 = [b valueForKeyPath:@"bar"]; // 正确
 ...
@end

其实上面说的那两对方法使用上基本是一样的,只是valueForKeyPath的值是一个路径(路径之间以点号 . 分割),比如数据成员就是对象自己,寻值过程就会向下深入下去。
注意,这里的数据成员的名字都是使用的字符串的形式。这种使用方法的最好的用处在于将数据(名字)绑定到一些触发器(尤其是方法调用)上,
例如键值对观察(Key-Value Observing, KVO)等。

上述代码说明了类的成员变量也可以使用基类NSObject的那两对方法去访问,不一定直接通过类实例访问,但是这种方式还是有一定的风险,具体危 险情况请参考这个:http://www.devbean.info/2011/04/from_cpp_to_objc_20/
然后我再说下原理,是俺Copy过来的,大家观赏下:
KVC运用了一个isa- swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa- swizzling,来实现其内部查找定位的。
isa指针,如其名称所指,(就是is a kind of的意思),指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。

比如说如下的一行KVC的代码:

[site setValue:@"sitename" forKey:@"name"];
就会被编译器处理成:

SEL sel = sel_get_uid ("setValue:forKey:");
IMP method = objc_msg_lookup (site->isa,sel);
method(site, sel, @"sitename", @"name");
首先介绍两个基本概念:

(1)SEL数据类型:它是编译器运行Objective-C里的方法的环境参数。

(2)IMP数据 类型:他其实就是一个编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型(事实上,在Objective-C的编译器处理的时候,基本上都是C语言的)。
这下KVC内部的实现就很清楚的清楚了:一个对象在调用setValue的时候,
(1)首先根据方法名找到运行方法的时候所需要的环境参 数。
(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。
(3)再直接查找得来的具体的方法实现。

2.KVO:  key-value observing(键值监听)与KVB: key-value Binding(键值绑定)

这两个机制是结合起来使用的,分别说下,

Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制。每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者。

KVO的优点

当 有属性改变,KVO会提供自动的消息通知。这样的架构有很多好处。首先,开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。这是KVO 机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。开发人员不需要添加任何代码,不需要设计自己的观察者模型,直接可 以在工程里使用。其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同一个属性,以及相关的值。

KVB实现的两个基本方法
1:为对象添加观察者OBserver  addObserver:forKeyPath:options:context:
2:观察者OBserver收到信息的处理函数   observeValueForKeyPath:ofObject:change:context:

KVO和KVB最明显的使用场景就是在一些界面实时显示行很强的地方,比如股票走向、售票余额等,这种方式免去了我们自己操作通知的麻烦,想到这,我发现当初点金和91市场中下载页面进度的显示也完全可以采用这种方式。

先说到这儿吧,更精彩的待续。。。。。。。。

原英文链接:http://maniacdev.com/2012/12/helper-classes-for-easy-cocoa-touch-key-value-observing-kvo-and-key-value-binding-kvb/

 

 

1、setValue:forKey: 可以访问到setXXX:方法。

2、valueForKey:可以访问到实例变量和不带参数的方法。

3、performSelector可以访问所有方法。




本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3472752.html,如需转载请自行联系原作者

目录
相关文章
|
小程序 前端开发 JavaScript
微信小程序全栈开发中的PWA技术应用
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中PWA技术的应用,PWA结合Web的开放性和原生应用的性能,提供离线访问、后台运行、桌面图标和原生体验。开发者可利用Service Worker实现离线访问,Worker处理后台运行,Web App Manifest添加桌面图标,CSS和JavaScript提升原生体验。实践中需注意兼容性、性能优化和用户体验。PWA技术能提升小程序的性能和用户体验,助力开发者打造优质小程序。
371 0
|
SQL 关系型数据库 MySQL
入职必会-开发环境搭建16-MySQL下载和安装
MySQL是一种流行的开源关系型数据库管理系统(RDBMS),它是由瑞典公司MySQL AB开发的,后来被Sun Microsystems收购,再之后成为Oracle旗下的产品。MySQL是广泛使用的关系数据库管理系统(RDBMS),它使用结构化查询语言(SQL)来访问和管理数据库。MySQL是开源的,这意味着任何人都可以免费使用和修改它,适用于各种操作系统,如Linux、Windows和MacOS。
254 1
入职必会-开发环境搭建16-MySQL下载和安装
|
算法 计算机视觉 Python
DSP技术在音频处理中的创新与实践
DSP技术在音频处理中的创新与实践
295 2
|
人工智能 弹性计算 算法
一文解读:阿里云AI基础设施的演进与挑战
一文解读:阿里云AI基础设施的演进与挑战
|
存储 开发工具 git
git工具使用教程全讲解
本文介绍了版本控制的概念及其重要性,详细对比了多种版本控制工具,如VSS、CVS、SVN和Git,重点讲解了Git的基本使用方法、工作原理及与SVN的区别。此外,文章还介绍了GitHub、GitLab和Gitee等流行的代码托管平台,以及如何在这些平台上注册账号、创建和管理仓库。最后,文章还提供了如何在IntelliJ IDEA中配置和使用Git的具体步骤。
440 1
|
安全 Linux Go
Linux数据备份与恢复
Linux数据备份与恢复
339 5
|
JavaScript 前端开发 Java
多种语言请求API接口方法
每种语言和库的选择取决于具体需求、项目环境以及个人偏好。了解这些基本方法,开发者就可以根据项目需求选择合适的语言和库来高效地与API交互。
386 1
|
机器学习/深度学习 数据采集 人工智能
软件测试中的人工智能:现状与未来
随着人工智能技术的迅猛发展,软件测试领域正经历着深刻的变革。本文将探讨人工智能在软件测试中的应用、挑战以及未来的发展趋势,旨在为读者提供全面而深入的理解。
|
机器学习/深度学习 人工智能 边缘计算
高算力服务器的应用场景
【10月更文挑战第18天】高算力服务器作为现代信息社会不可或缺的计算资源,正广泛应用于各行各业。从人工智能到科学研究,从智能交通到数字孪生,它为复杂的计算任务提供了不可替代的支持。
669 0