一个objc对象的isa指针指向他的类对象,类对象的isa指针指向他的元类,元类的isa指针指向根元类,所有的元类isa都指向同一个根元类,根元类的isa指针指向根元类本身。根元类super class父类指向NSObject类对象。根metaclass(元类)中的superClass指针指向根类,因为根metaclass(元类)是通过继承根类产生的。
实例对象的isa指针, 指向他的类对象,类对象的isa 指针, 指向他的元类。系统判断一个对象属于哪个类,也是通过这个对象的isa指针的指向来判断。对象中的成员变量,存储在对象本身,对象的实例方法,存储在他的isa 指针所指向的对象中。
对象在调用减号方法的时候,系统会在对象的isa指针所指向的类对象中找方法,这一段在kvo的实现原理中就能看到,kvo的实现原理就是系统动态的生成一个类对象,这个类是监听对象的类的子类,在生成的子类中重写了监听属性的set方法,之后将监听对象的isa指针指向系统动态生成的这个类,当监听对象调用set方法时,由于监听对象的isa指针指向的是刚刚动态生成的类,所以在执行的set方法也是子类中重写的set方法,这就是kvo的实现原理。同理,我们也可以通过rutime中的方法设置某个对象isa指针指向的类对象,让对象调用一些原本不属于他的方法。
[super viewDidLoad];
Man * man = [Man new];
Man * man1 = [Man new];
Class manClass = object_getClass(man);
Class metaClass = class_getSuperclass(manClass);
struct wx_person* p = (__bridge struct wx_person * )man;
struct wx_person* p1 = (__bridge struct wx_person * )man1;
NSLog(@"\nperson = %p,person1 = %p ,persopnclass = %p\n,p->isa = %p,p1->isa = %p",man,man1,manClass,&(p->isa),p1->isa);
截屏2020-03-1213.12.00.png
其实在OC中实例对象和类都是一个结构体
实例对象的地址,就是实例对象地址就是结构体中isa指针的地址,实例对象的isa指向的类的结构体。
从上图我们也可以看出man->isa指向的Class Man这个类。
网友评论