你不知道的KVO的内部实现

通过强大的Runtime 实现。第一次观察某个Object 时,runtime 会创建一个新的继承自 object 对应Class 的 subClass。在这个新subClass 里它重写了被观察的key(属性)的setter 方法。然后将object 指向原来对应Class 的isa指针指向了新创建的subClass【原因很简单,实例对象保有变量,而向对象发消息实际是那isa 去类对象里找对应的实例方法去了。即重写的setter 方法】;

这些被重写的setter 实现了如何通知观察者们。

有意思的是:ios 不希望这个机制暴露在外。除了setter ,这个动态生成的subClass 同时也重写了  -class  方法,依旧返回原先的class. 不知细看的话,被kvo 过得object 看起来和原先的object 没什么两样。【而实际是object 所指向的类 及里面的有些实例方法 变了】。

关于代码验证可见:    http://limboy.me/ios/2013/08/05/internal-implementation-of-kvo.html

可以不用他那个gcc 编译,在自己项目的main.m 里替换下。会有两个错。

obj - > isa   可以用 object_getClass(obj) 替换也是一样的。

你不知道的KVO的内部实现

时间: 2024-08-08 22:01:15

你不知道的KVO的内部实现的相关文章

(译)KVO的内部实现

09年的一篇文章,比较深入地阐述了KVO的内部实现. KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模式通常需要单独实现,而在Objective-C中,通常无须增加额外代码即可使用. 概览 这是怎么实现的呢?其实这都是通过Objective-C强大的运行时(runtime)实现的.当你第一次观察某个object时,runtime会创建一个新的继承原先class的subclass.在这个新的class中,

KVO的内部实现

KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到.在其他语言中,这种观察者模式通常需要单独实现,而在Objective-C中,通常无须增加额外代码即可使用. 概述 这是怎么实现的呢?其实这都是通过Objective-C的运行时实现的.当你第一次观察某个对象的时候,runtime会创建一个新的继承原先class的subclass.在这个新的class中,它重写了所有被观察的key,然后将object的isa指针指向新创建的class

iOS ---- KVO的内部实现原理

Key-Value Observing (KVO) KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制.   [persion addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld |NSKeyValueObservingOptionNew context:nil]; 只要当前类中 age 这个属性发生的变化都会触发到以下的方法 - (void)observeValueForKeyPat

KVO的内部实现原理

Key-Value Observing (KVO) 首先我们先了解下 KVO 的机制,KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制. 例如:   [persion addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil]; 只要当前类中 age 这个属性发生的变化都会触发到以下的方法 - (void

iOS通讯模式(KVO、Notification、Delegate、Block、Target-Action的区别)

文章翻译自 https://www.objc.io/issues/7-foundation/communication-patterns/ 每个Application或多或少都有一些松耦合的对象(模块)组成,他们必须彼此通讯来完成工作.这篇文章将会通过可用的通讯机制,并以Apple的Framework来举例,并给出最佳的实践建议关于使用哪种通讯机制. 虽然这个问题是关于Foundation框架的,但是我们可以通过Foundation的通讯机制,差不多有这几个通讯方法 - KVO,Notifica

iOS面试题04-runtime

runtime/KVO等面试题 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法. 派生类在被重写的setter方法实现真正的通知机制(Person->NSKVONOtifying Person) Person类对象p设置self控制器且设置监听属性,就会调用observeValueForKeyPath方法,当Person类的属性被

KVO内部实现原理

// // ViewController.m // KVO内部实现原理 // // Created by sw on 15/4/13. // Copyright © 2015年 sw. All rights reserved. // #import "ViewController.h" #import "Person.h" @interface ViewController () @end @implementation ViewController - (void

iOS------通知、代理、kvo 详解

通知:通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信.实际上就是一个二传手,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象.通知中心是基于观察者模式的,它允许注册.删除观察者. 一个 NSNotificationCenter 可以有许多的通知消息 NSNotification, 对于每一个 NSNotification 可以有很多的观察者 Observer 来接收通知. 委托代理:委托代理(degegate),顾名思义,把某个对象要做的事情委

你不知道的JavaScript--Item23 定时器的合理使用

1.定时器概述 window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval.其中前者可以使一段代码在指定时间后运行:而后者则可以使一段代码每过指定时间就运行一次.它们的原型如下: window.setTimeout(expression,milliseconds); window.setInterval(expression,milliseconds); 其中,expression可以是用引号括起来的一段代码,也可以是一个