1. runtime 基本概念
基本数据结构:Class,Method,SEL,IMP,id
Class:指向objc_class的结构体指针,objc_class结构体如下:
Method:指向objc_method的结构体指针,可以从objc_class中获取objc_method_list,objc_method结构体如下:
SEL:指向objc_selector的结构体指针,用来表示一个方法的名字,结构:typedef struct objc_selector *SEL;
IMP:函数指针,指向的函数包含一个接受消息的对象id,函数的方法名字,以及函数的若干个参数, 结构:typedef void (*IMP)(void /* id, SEL, ... */ );
id:指向objc_object结构体的指针,objc_object中只包含一个指向objc_class的isa指针,所以任何继承NSObject的对象都可以用id表示;
2. KVO实现代码
HPNotificationCenter类:用于判断是否已经创建过对应的子类的类对象
HPTargetClassManager类:用于判断相同子类的不同实例对象,根据内存地址判断,并创建共同的方法,class, dealloc方法等
HPTargetClass类:重写观察对象的set方法
创建实例之后,打印其指向的地址,没有变化,只有用object_getClass()发现isa指针发生变化,借助于NSObject+DLIntrospection, po [object_getClass(subClassA) instanceMethods]能看到对应的实例方法发生变化