`

KVO/KVC 实现机理分析 (转)

    博客分类:
  • ios
 
阅读更多

Objective-C里面的Key-Value Observing (KVO)机制,非常不错,可以很好的减少浇水代码。关于KVO的学习,可以参考文章:《Key-Value Observing快速入门》:http://www.cocoadev.cn/Objective-C/Key-Value-Observing-Quick-Start-cn.asp

  

Key-Value Coding(KVC)实现分析

    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如何避免动态绑定,而获得方法地址》:http://www.cocoadev.cn/Objective-C/Get-method-address.asp

    这下KVC内部的实现就很清楚的清楚了:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。

 

Key-Value Observing(KVO)实现

    在上面所介绍的KVC机制上加上KVO的自动观察消息通知机制就水到渠成了。

    当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。所以isa指针其实不需要指向实例对象真实的类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。

    熟悉KVO的朋友都知道,只有当我们调用KVC去访问key值的时候KVO才会起作用。所以肯定确定的是,KVO是基于KVC实现的。其实看了上面我们的分析以后,关系KVO的架构的构思也就水到渠成了。

    因为KVC的实现机制,可以很容易看到某个KVC操作的Key,而后也很容易的跟观察者注册表中的Key进行匹对。假如访问的Key是被观察的Key,那么我们在内部就可以很容易的到观察者注册表中去找到观察者对象,而后给他发送消息。

分享到:
评论

相关推荐

    KVO-KVC-demo

    与博客配套的KVC KVO代码,博客地址http://blog.csdn.net/liuyinghui523/article/details/77885198 简单的总结

    kvo-kvc介绍

    对kvo-kvc使用的说明。对于初学者有一定的帮助,对代码优化有一点好处。

    MAC下KVO,KVC的小demo

    KVO,KVC在MAC下的小DEMO,喜欢的换就拿去吧

    KVO-KVC.zip_DEMO_kvo demo

    objective-c下KVO-KVC模式的一个小小DEMO

    KVO-KVC-Advance

    网上有这个KVO的例子,就是改变数组中删除,插入内容时,更新tableview,我又加了修改的事件。

    ios kvo kvc 编程

    英文文档 iso kvo kvc "mvc with less code".

    IOS观察者模式

    本demo主要讲的是IOS内的kvo、kvc的综合应用,许多人有时候分不清kvo/kvc之间的区别,本demo将为你详细区分

    IOS KVC和KVO

    已经拥有一年经验的你真的了解KVC,KVO吗?也许不!以前我以为自己都有上架项目,这都是太基础的东西,但今天我重新回头看了以前做的笔记,真的是书读百遍,其义自见。

    oc中的通知,kvc,kvo

    关于ios学习中的通知和kvc,kvo案例的整理,基础的oc学习

    KVC-KVO原理详解及编程指南

    详细的介绍了KVO与KVC的原理机制,可以有效运用KVO-KVC编程

    swift-KVC与KVO使用姿势和原理解析

    KVC 与 KVO 使用姿势和原理解析

    KVC、kVO原理详解

    KVC、kVO原理详解

    KVC_KVOTest Demo代码

    KVC_KVOTest Demo代码 KVC KVO IOS 观察者 Observe

    IOS中KVC和KVO用法demo

    使用KVC对属性赋值 使用KVC对属性取值 KVC对数组取值 KVO是key value observing, 它是一种非常重要的机制,允许监听属性值的变化

    30道 iOS底层面试题(上)

    30道iOS底层面试题,适合准备面试的人群,包含底层各种逻辑,比如isa指针,分类,block,离屏渲染,ro、rw、rwe,元类,原子属性,KVO/KVC,死锁,单例,load,App启动流程,IMP方法查找,dealloc实现机制等等

    iOS KVC实现原理

    iOS KVC实现原理,供参考学习。适合有一定基础的。自己研究的,不喜勿喷。

    ios KVO实现原理

    ios kvo原理的实现demo

    KVO(NSKeyValueObserving)和KVC(NSKeyValueCoding)

    KVO(NSKeyValueObserving)和KVC(NSKeyValueCoding)的代码例子 描述基本的kvo kvc怎么使用

    KVC,KVO机制

    KVC 是基于OCRuntime机制,Runtime机制里面可以通过得到实例变量并且访问其私有的成员变量区;实现keyPath中的访问能力;KVO一种通知发送机制,实现一对多,多对一的映射关系

    KVO实现例子

    http://blog.csdn.net/qqmcy/article/details/50635252 kvo实现说明

Global site tag (gtag.js) - Google Analytics