(知其所以然 主题3)论观察者模式之KVC和KVO

在开发的时候,是不是忽然有种错觉:我们好像是代码的搬运工,一个项目开始,把自己写好的、封装好的类、框架亦或别人写好的第三方框架不假思索的运用到项目中,一方面:项目时间紧;二方面:简单好用,减少了代码量。但是有时候,我们是否应该停下脚步,
从底层去看看代码的世界,那样我们收益会颇丰,让我们一起走在学习的路上吧!

在开发中,有很多地方都需要对KVC和KVO进行运用。我们只知道这是Object-C提供的一个不错的机制,可以很好的减少代码;但是我们可能不会过多的去了解它底层是如何实现的,下面,我们一起来看看吧!

(一) KVC的实现与运用

KVC 的底层实现是运用了 isa-swizzling 技术,也就是类型混合指针机制。通过
isa-swizzling,能够来实现其内部查找定位的。isa 指针,就是 is a kind of
的意思,指向系统维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针和其它数据对象。

比如下面的这句代码:


1 [Account  setValue:@"userAccount" forKey:@"account"];
2
3 经过KVC内部编译后,其内部实现如下:
4
5 SEL sel = sel_get_uid("setValue:forKey:");
6 IMP method = objc_msg_lookup (account->isa,sel);
7 method(account,sel,@"userAccount",@"account");

我们就可以分析得出:

SEL是一种数据类型,是编译器运行Objective-C里的方法的环境参数。

IMP也是一种数据类型,说白了就是编译器内部实现时候的函数指针。也就是说:当编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型。
 

KVC在调用方法setValue的时候,会依照以下步骤执行:

a)根据方法名找到运行方法的时候所需要的环境参数;

b) 结合isa指针,找到具体的方法实现的接口;

c) 对查找的方法进行具体的实现

所以,KVC的运作流程就是:当一个对象注册了一个观察者,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。比如说:我们在运用KVC进行字典和模型之间转化时,要完全一致对象实例的类名,就是这个道理。

(二)KVO的实现和运用

KVO是指当指定的对象的属性被修改了,让要进行事件处理的对象及时接收到通知的一种实现机制。

1 定义:
2 [self addObserver:self forKeyPath:@"code" options:0 context:str];
3 实现
4 - (void)observeValueForKeyPath:(NSString *)keyPath   ofObject:(id)object   change:(NSDictionary *)change  context:(void *)context

在运用KVO的时候,当有属性发生改变时,会提供自动的消息通知。这样我们在开发的时候就不需要去具体实现(运用代理、block),如每次属性改变了就发送消息通知。我们不需要设计自己的观察者模型,直接可以在项目里进行使用,十分快捷和方便。

    此外,KVO 的架构非常的强大,有框架支持,可以很容易的支持多个观察者观察同一个属性,以及相关的值。

具体的实例会在稍后发表,让我们在案例中进一步体会这两种观察者模式的运用和实现。

时间: 2024-10-18 21:48:39

(知其所以然 主题3)论观察者模式之KVC和KVO的相关文章

(知其所以然 主题2)从底层分析OC中ARC和非ARC下深复制和浅复制

今天,在坊间听到有人在争论OC中关于NSString的深浅复制,听了下,感觉很有必要来一个分析总结,让我们从底层去了解OC中深浅复制的运作机制. 所谓copy就是在原有对象的基础上产生一个副本对象,遵循最关键的两点原则: 1. 改变原对象的属性和行为不会对副本对象产生任何影响 2. 改变副本对象的属性和行为不会对原对象产生任何影响 在理解了这一层之后,我们一起来研究下deep copy 和 shallow copy,因为苹果是一个非常注重性能的公司,所以拷贝在底层实现没那么简单: 以NSStri

知其所以然(以算法学习为例)

原文发表于2008年 其实下文的绝大部分内容对所有学习都是同理的.只不过最近在正儿巴经地学算法,而后者又不是好啃的骨头,所以平时思考总结得就自然要比学其它东西要多一些. 问题:目前几乎所有的算法书的讲解方式都是欧几里德式的.瀑布式的.自上而下的.每一个推导步骤都是精准制导直接面向目标的.由因到果,定义.引理.定理.证明一样不少,井井有条一丝不乱毫无赘肉.而实际上,这完全把人类大脑创造发明的步骤给反过来了.看起来是阳关大道,实际上车马不通. 而对读者来说,这就等于直接告诉你答案&做法了,然后让你去

逻辑思维-----学东西、做事情,要用自己的思路去扩展知识和技能----知其所以然

今天工作的时候,想到自己做一项工作任务的时候,往往会浪费掉很多的时间去动手操作,去熟悉软件的使用方法. 然而,我的方法是完全错误的,原因就在于还没有掌握一些软件的使用方法和原理. 这样造成的一个后果就是,在错误中慢慢去了解,在网上搜来的资料中去梳理出正确的操作步骤.最终就是浪费时间! 如何去改正这种不良的学习习惯.工作习惯呢? 下午想到了这样的做法:拿到一个任务,首先在脑子里有个整体的把握,知道要去掌握关于这个任务的哪些相关方面的知识,比如要去操作可以与oracle数据库进行交互的 pl/sql

转载:知其所以然(以算法学习为例) 作者: 刘未鹏

作者: 刘未鹏  发布时间: 2016-07-23 18:41  阅读: 3917 次  推荐: 11   原文链接   [收藏] 原文发表于2008年 其实下文的绝大部分内容对所有学习都是同理的.只不过最近在正儿巴经地学算法,而后者又不是好啃的骨头,所以平时思考总结得就自然要比学其它东西要多一些. 问题:目前几乎所有的算法书的讲解方式都是欧几里德式的.瀑布式的.自上而下的.每一个推导步骤都是精准制导直接面向目标的.由因到果,定义. 引理.定理.证明一样不少,井井有条一丝不乱毫无赘肉.而实际上,

学习的过程必须要知其所以然

其实下文的绝大部分内容对所有学习都是同理的.只不过最近在正儿巴经地学算法,而后者又不是好啃的骨头,所以平时思考总结得就自然要比学其它东西要多一些. 问题:目前几乎所有的算法书的讲解方式都是欧几里德式的.瀑布式的.自上而下的.每一个推导步骤都是精准制导直接面向目标的.由因到果,定义.引理.定理.证明一样不少,井井有条一丝不乱毫无赘肉.而实际上,这完全把人类大脑创造发明的步骤给反过来了.看起来是阳关大道,实际上车马不通. 而对读者来说,这就等于直接告诉你答案和做法了,然后让你去验证这个答案&做法是可

知其然知其所以然--Properties.Settings.Default.Save();

winform提供自带的配置,最近查看了一下,数据到底保存到什么地方去了 主目录在这下面C:\Users\Administrator\AppData\                 使用的是win7的系统 C:\Users\Administrator\AppData\Local\程序的名字\BmpProject.exe_Url_2zmdfmzmrtwjomeciqta4ch2sieyx4id\1.0.0.0\user 最后一个user是一个xml config类型的 文件 <?xml vers

iOS开发-由谈KVC、KVO(重点观察者模式)机制编程

一 不小心,小明在<跟着贝尔去冒险>这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文 化外,还是镜头少普通话跟小明一样烂的Laughing Sir那种冷静和沉着稳定留下了深刻印象,不由想起电视剧<学警狙击>中为了不暴露钟立文的身份,要求向自己补一枪的警匪卧底巅峰推动者 --Laughing 哥.那么,卧底这样的工作,在我们程序里有没有呢?答案是肯定的,观察者模式. 文章内容思维导图 一.基本概念 1)KVC概念 KVC

iOS开发-观察者模式

观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.观察者模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.iOS开发中最明显的观察者模式就是KVO键值对观察,如果对于KVC和KVO不是很熟悉,可以参考本人之前博客iOS开发-KVC和KVO的理解. 关于设计模式网上的介绍多如牛毛,参考资料随手可查,简单的使用OC实现一下观察

[设计模式] Javascript 之 观察者模式

观察者模式:定议 定义对象间的一种一对多的关系,当一个对象状态改变时 (一般称为被观察者),依赖于该对象的对象被通知,并更新; 观察者模式:说明 1. 观察者模式是行为模式,也被称为:发布-订阅模式.模型-视图模式.源-监听器模式.从属者模: 2. 面对象过程中观察者模式的组成: 1>. 抽象主题角色:这个角色里,定义维护了一份对观察者列表的管理集,一组用数组来存放,并定义了对一些基础的接口,比例用来添加跟删除观察者的方法: 2>. 具体主题角色:这个角色,对于与客户,具体业务状态数据交互,并