KVO和Weak的实现原理

1、kvo的实现原理:

(1)当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制
(2)如果原类为Person,那么生成的派生类名为NSKVONotifying_Person
(3)每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法
(4)键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey:一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。

补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类

KVO监测的是派生类,并不是当前类,通过指针在当前类和派生类之间进行切换。

2,weak的实现原理:
Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象的地址)数组。

weak 的实现原理可以概括一下三步:

1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。

2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。

3、释放时,调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,857评论 0 9
  • 面试题参考1 : 面试题[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios阅读 1,771评论 0 4
  • 文丨乌托邦 中午时分,太阳毫不收敛地炙烤着,要不是远处吹来的海风,这里将会无比的沉闷燥热。 踏上下大陈岛,一股股浓...
    乌托邦1990阅读 578评论 0 4
  • 如电影最后而言,时间终于来到19年后,哈利·波特人至中年,有了深爱的妻子儿女。就在大家刷屏聊哈利的时候,我独独想起...
    她的糖不苦阅读 2,225评论 0 0
  • 看了乐嘉的色眼识人我认定自己红色部分的性格要大于其他部分的,红色的天赋潜能作为个体,具有高度乐观的积极心态,把生...
    我是马依云阅读 393评论 0 0