美文网首页
iOS 对象和isa指针详解

iOS 对象和isa指针详解

作者: MiniCoder | 来源:发表于2020-03-12 13:17 被阅读0次

    一个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这个类。

    相关文章

      网友评论

          本文标题:iOS 对象和isa指针详解

          本文链接:https://www.haomeiwen.com/subject/cjjujhtx.html