安卓音频用的是广播方式,也就是可以后台同时执行其他程序,IOS底层架构采用的是某一时刻只有一个程序在运行,所以对比来说IOS只处理一个任务,速度效率很高,而android要达到同样的效果就需要更大的内存,频率更高的CPU
前面我们提到,在OC对象中实例对象的isa是指向类对象,类对象的isa指向元类对象,这样我们可以通过isa把OC中的三种对象联系起来。那么,isa是怎么实现的呢?实例对象的isa直接存放着类对象的地址,类对象的isa直接存放元类对象的地址吗?
那么实例对象是怎么通过isa来找到类对象的呢?这里就不得不提一个ISA_MASK的东西,我们还是从源码寻找答案。
其实这个问题不难解决,因为我们可以看到objc_class的结构,那么我们可以定义一个和它一样的结构体来获取isa
添加观察者前,如图(1):
添加观察者后,如图(2):
分析KVO底层原理:
kvo基于runtime机制实现,使用了isa交换(isa-swizzling)
添加observer:
当一个对象的属性值发生改变时,系统会自动生成一个子类,并且以NSKVONotifying_+类名来命名,将之前对象的isa指针指向了这个子类,重写了观察对象的setter方法,并且在重写的方法中添加了willChangeValueForKey:和didChangeValueForKey:而这两个方法内部会主动调用observeValueForkeyPath,从而实现监听内容的改变。
移除oberver:
让isa指向原来的类对象
iOS底层原理07:类 & 类结构分析 中我们对 类结构 有了大概的认识,本文主要探索 objc_class 的 bits属性 ,探索 成员变量 、 属性 、 方法 (对象方法、类方法)、 协议 等是如何存储的
WWDC2020中关于数据结构的变化(Class data structures changes)视频地址
Object-C运行时会使用这些 数据结构 来跟踪类,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)