iOS isa-swizzling(类指针交换)

550 阅读1分钟

相关链接

isa-swizzling 就是类指针调整
  • 在OC中每个类本质都是一个结构体如下
struct NSObject_IMPL {
    Class isa;
};

每个结构体中都包含一个isa指针,该指针都会指向相应的类对象。类对象包含对应的成员变量列表,函数列表,协议列表等(⚠️不包含类方法)。而类对象中也有一个isa指针,指向元类对象(metacalss),元类对象包含类方法列表

  • 无法增加对象的成员变量

如上代码,对象在内存中是以结构体的形式存在,该结构体的大小不能动态改变,因此无法在运行时给对象增加成员变量

  • 可以动态增加对象的方法

在类对象中有一个methodLists的指针,指向类方法列表的值,可以通过修改该指针的值,动态为类增加方法。(这就是分类Category的原理,说明为什么分类不能增加属性,却能增加方法,在分类中不能添加成员变量,会报错,添加属性,只是声明了setter和getter方法,并没有实现)

  • 关联对象并不能改变对象的内存结构
isa-swizzling 就是把一个实例对象的isa指针指向另一个中间类

比如KVO的实现,KVO就是在程序运行时动态的生成一个NSKVONotifying_xxx的类,该类实现了对应属性的setter方法,并在setter方法中调用了willChangeValueForKey和didChangeValueForKey,当属性发生改变时就会出发监听通知机制 KVC KVO