KVO 原理个人理解

期初,这个是因为朋友说的,忘记是哪所大公司的笔试题,说 KVO 的实现为什么要创建一个子类。当初,我还瞎说的做了一个回答,感觉这个也没啥呢。随着自己兴趣使然,我就简单搜索了一下,我天,铺天盖地的文献,才知道,原来这个也是个领域哦。

后来就慢慢的接触、了解,也听说了很多新词,其中陌生的要属 isa 指针了,因为当初这个东西只是在打断点的时候看过,但是从来不知道是干啥的,也没有深究过,另外一个是 Runtime 机制,好像一下子就把这个天天用也天天不在意的 KVO 提高了很高很高的档次,“有三四层楼那么高”    —《功夫》!

然后,经过了差不多一个月左右的专研,给 isa 算是弄懂了,Runtime 看不懂,虽然知道什么:动态的创建类、更改执行的两个方法、动态的增加类的方法(Category),还有什么消息发送机制什么的,但是始终一头雾水。isa 我写了一篇白话技术档了,这里不再苦述。

那么,KVO 到底是啥子?用我们肯定会用,但是也保不齐用不好,不是忘记注册就是忘记移除的,要么就是那个新旧值的枚举都能写错的。暂且先算会用,比如一个类中的属性增加了监听,然后在监听回调方法中完成事件处理。那么注册监听的时候这个类都做了哪些事情呢?

首先、一个类的属性被注册了监听,那么就会:

创建一个类的元类,

创建一个类的元类,

创建一个类的元类,重要的事情说三遍,这里我必须要解释一下,因为好多文章都管这个叫做了新类。元类也是类,这里会涉及 isa 指针,也正是这个指针的特性和这个“新类”弄得我一个多小时都想不明白。

第一、isa 指针指向元类,它并不是指向父类,这个必须要牢记。元类不是父类,元类中有类的方法。

第二、对象收到消息后,就会在对象本身查找实例的方法,如果没有实现的方法,就会去找父类的元类,父类的元类就是父类的方法,子类继承父类,也就间接等于去父类里找方法了,所以这里是一个闭环。

第三、实例的实例方法存在于实例的类中,类的类方法存在于类的元类中,元类的方法存在于根元类中。所以类、元类、根元类就是存比它小一级的实例的方法的。

牢记上面以后,我们再接着来。

一个类的属性被注册了监听,那么就会创建这个类的元类,同时将 isa 指针指向新的元类,取名大概是 NSKVONotifying_objectName ,objectName 就是你监听的那个类的名字,然后,重写这个元类中的你监听的那个属性的 setter 方法,当有给类的属性赋值的操作的时候,Runtime 就按照 isa 指针的指引去这个元类中寻找调用 setter 方法,然后发送通知。

至于发送通知和对象接收通知的实现,那是关于 NSKeyValueObserving协议的履行,这里不做苦述。

时间: 2024-10-08 05:23:51

KVO 原理个人理解的相关文章

KVC/KVO原理详解及编程指南(转载)

KVC/KVO原理详解及编程指南 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模式的一种实现

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

http://blog.csdn.net/wzzvictory/article/details/9674431 2.KVC/KVO实现原理 键值编码和键值观察是根据isa-swizzling技术来实现的,主要依据runtime的强大动态能力.下面的这段话是引自网上的一篇文章: http://blog.csdn.net/kesalin/article/details/8194240 当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的

Spring框架AOP的使用及个人对底层原理的理解

Spring框架AOP的使用及个人对底层原理的理解**** 前言: AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,今天要给大家分享的是Spring框架AOP的使用,以及我个人对底层原理的一些理解. Aop使用步骤 配置aop信息 <aop:config> 相当于aop的根节点 配置切入点 <aop:piontcut> 切入点 可以理解为需要增强的方法

转:KVC/KVO原理详解及编程指南

作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NS

ios-kvc\kvo 原理

原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 KVC(Key-value coding)键值编码,类似于map,提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制. KVO(Key-value observing)键值观察,提供了一种当其它对象属性被修改的时候能通知当前对象的机制. 1.Key和Key Path KVC定义了一种按名称访问对象属性的机制,支持这种访问的主要方法是: - (id)valueFo

刨根问底KVO原理

介绍 KVO( NSKeyValueObserving )是一种监测对象属性值变化的观察者模式机制.其特点是无需事先修改被观察者代码,利用 runtime 实现运行中修改某一实例达到目的,保证了未侵入性. A对象指定观察B对象的属性后,当属性发生变更,A对象会收到通知,获取变更前以及变更的状态,从而做进一步处理. 在实际生产环境中,多用于应用层观察模型层数据变动,接收到通知后更新,从而达成比较好的设计模式. 另一种常用的用法是 Debug,通过观察问题属性的变化,追踪问题出现的堆栈,更有效率的解

编译原理的理解

编译原理内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成.大一点的应用可以做到一定的技术先进性,从而让你在本行业站稳脚跟:分析和分解用户输入的SQL语句,理解是否有害和是否有SQL注入等.如果不学,对于不是不是本行业的人来说就没损失,如果是本行业的专业人士,不学只会令自己的编译理解更慢.

0909对编译原理的理解

1.编译原理学什么? 编译原理旨在让人们学习编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成,而且这门课程关注的是编译器方面的产生原理和技术问题.回归到本质上,学习编译原理其实也就是学习一个相对复杂的算法. 2.为什么学编译原理? 编译原理这门课程实际蕴含着计算机学科中解决问题的思路.形式化问题和解决问题的方法,这些思路和方法除了对应用软件和系统软件的设计与开发有一定的启发和指导作用外,在提倡学科的交叉不断创新

对编译原理的理解

编译原理就是什么? 在我看来,编译原理就是将高级语言翻译成计算机语言(即计算机所能识别的二进制代码)所遵循的规律,并且让你理解机器是如何理解高级语言的. 学习编译原理有什么好处? 当你真正完成编译原理的学习后,你对你所写的程序.程序语言都会有更深的本质认识,这样的认识也会让你站的高度完全不同,并且知道编译的过程方法理论,可以为以后学习工作打下基础,而且编译原理并不仅仅是用来写编译器的,还可以在许多意想不到的领域进行应用.如果以后走工程方向的,学好编译原理可以基本囊括所有需要的技术,锻炼脑力,同时