`

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的正确使用方式和潜在的陷阱。 在实际项目中,KVC和KVO结合使用可以创建出强大的数据驱动的应用。例如,模型对象可以通过KVC轻松地序列...

    kvo-kvc介绍

    - 与KVO结合:KVC常用于触发KVO通知,实现属性的自动更新。 **KVC的局限性:** - 错误处理:如果键不存在或类型不匹配,KVC可能会抛出异常,因此需要做好错误处理。 - 性能:相比于直接访问属性,KVC操作通常较慢,...

    KVO-KVC-Advance

    总结来说,KVO和KVC是Objective-C中实现数据绑定和动态属性访问的重要技术,它们极大地提高了代码的灵活性和可维护性,尤其是在UI与数据模型间的交互中。理解并熟练运用这两种技术,对提升iOS开发技能有着重要作用。

    KVO-KVC.zip_DEMO_kvo demo

    **KVO(Key-Value Observing)与KVC(Key-Value Coding)是Objective-C中的两种重要编程概念,主要用于对象属性的监听与间接访问。在这个DEMO中,我们将深入探讨这两种技术的工作原理、应用场景以及如何在实践中使用...

    MAC下KVO,KVC的小demo

    **KVO(Key-ValueObserving)与KVC(Key-ValueCoding)是Objective-C中的两种重要特性,它们为Objective-C提供了数据绑定和属性访问的能力。在Mac开发中,这两种技术常常被用来实现数据模型与用户界面之间的动态交互...

    IOS KVC和KVO

    在实现KVO时,Objective-C会自动调用KVC方法来检查和修改属性值。 ### 注意事项 1. 安全性:使用KVC时,如果键不存在,可能会导致程序崩溃,因此需要确保键的有效性。 2. 性能影响:频繁使用KVC和KVO可能对性能...

    ios kvo kvc 编程

    ### iOS KVO KVC 编程 #### KVC与KVO简介 在iOS开发中,键值编码(Key-Value Coding, KVC)和键值观察(Key-Value Observing, KVO)是两个非常重要的概念,它们为Objective-C语言提供了一种灵活的方式来访问和修改...

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

    Swift中的Key-Value Coding(KVC)和Key-Value Observing(KVO)是两种强大的数据绑定技术,它们允许程序员间接访问对象的属性并监听这些属性的变化。在本文中,我们将深入探讨这两种技术的使用方法、工作原理以及...

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

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

    KVC、kVO原理详解

    ### KVC、kVO原理详解 #### 一、KVC(Key-Value Coding)与 KVO(Key-Value Observing)简介 KVC 和 KVO 是 Objective-C 中两个非常重要的特性,它们为开发者提供了强大的数据访问和观察机制。这两种技术在 Cocoa ...

    iOS KVC实现原理

    **iOS KVC(Key-Value Coding)实现原理** Key-Value Coding(KVC)是Apple在Objective-C中引入的一种机制,它允许程序通过键值来访问对象的属性,而无需直接调用setter或getter方法。KVC在很多Apple的框架中都有...

    KVC_KVOTest Demo代码

    **KVC (Key-Value Coding)** 是Objective-C中的一...通过分析和学习这个Demo,开发者可以更深入地理解KVC和KVO的工作原理,并在实际项目中有效地利用它们。这些技术对于创建响应式、灵活且易于维护的iOS应用至关重要。

    ios-KVO底层实现--利用runtime简单的实现KVO底层原理.zip

    **iOS KVO底层实现——基于...在提供的压缩包文件"KVO模拟"中,可能包含了一个简单的KVO实现示例,通过运行和分析代码,你可以更直观地理解上述概念。通过实践,加深对KVO和Runtime的理解,进一步提升iOS开发技能。

    ios KVO实现原理

    **iOS KVO(Key-Value Observing)实现原理** Key-Value Observing,简称KVO,是Objective-C中的一种机制,允许对象监听其他对象的属性变化。KVO是Apple为Foundation框架提供的一种强大的数据绑定技术,它使得一个...

    IOS中KVC和KVO用法demo

    KVC和KVO的结合使用,可以在iOS应用中实现灵活的数据绑定和动态数据更新,尤其在MVVM(Model-View-ViewModel)架构中,它们发挥着关键作用。KVC简化了对象属性的访问,而KVO则提供了实时数据变动的响应机制,两者...

    KVO实现原理demo

    4. **非KVC兼容性**:不是所有的属性都支持KVO,只有遵循KVC(Key-ValueCoding)协议的属性才能被观察。 **示例代码**: ```objc // 添加观察者 [myModel addObserver:self forKeyPath:@"myProperty" options:...

    KVO(NSKeyValueObserving)和KVC(NSKeyValueCoding)

    然而,需要注意的是,虽然KVO和KVC提供了便利,但也可能引入性能开销和潜在的错误,因此在设计和实现时应谨慎使用。 在实际项目中,KVO常用于视图模型与视图的数据绑定,而KVC则在Core Data、NSPredicate以及进行...

    swift-用objc库实现KVOKVC

    Swift本身并不直接支持KVO和KVC,但可以通过桥接头文件使用Objective-C的库来实现这些功能。本篇文章将深入探讨如何在Swift中利用objc库来实现KVO和KVC。 首先,理解KVO和KVC的基本概念: 1. KVO(Key-Value ...

    KVC_KVO_Demo

    在KVC_KVO_Test这个项目中,开发者可能创建了一个示例应用,演示了如何使用KVC和KVO进行属性的读取、设置以及监听属性变化。通过查看源代码,你可以学习如何在实际场景中应用这些概念,例如在用户界面更新、模型和...

    iOS中KVC-KVO例子

    KVC和KVO经常一起使用,因为KVO的底层实现依赖于KVC。当调用`addObserver:forKeyPath:options:context:`时,系统会尝试使用KVC来获取和设置属性的值,从而触发KVO的通知。 ### 注意事项 1. **属性要求**:为了使...

Global site tag (gtag.js) - Google Analytics