OC isa的走向图和类的继承关系

708 阅读1分钟
1.继ISA探锁后继续分析

上一节我们知道对象的内存地址的 前8个字节 就是对象的isa 其中isa中存储这各种信息,其中shiftcls 是存的类的信息,这样就可以通过对象来找出对应的类,我们把类的指针信息,再进行x/4gx 分析下 类是否也会有isa

2.我们来分析下 类的isa是否也存在
2.1 看以下代码:
#import <Foundation/Foundation.h>

#import <objc/runtime.h>

#import <malloc/malloc.h>

#import "LGPerson.h"

#import "LGTeacher.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

        LGPerson *p= [LGPerson alloc];

        LGTeacher *t =[LGTeacher alloc];

        NSObject *objc = [NSObject alloc];

        

        //NSObject 类

        Class class = object_getClass(objc);

        // NSObject元类

        Class metaClass = object_getClass(class);

        // NSObject 根元类

        Class rootClass = object_getClass(metaClass);

        // NSObject 元类父类

        Class o_superClass = class_getSuperclass(metaClass);

        NSLog(@"\n%p NSObject实例对象\n%p 类\n%p 元类\n%p 根元类 \n%p 元类父类",objc, class, metaClass, rootClass, o_superClass);

        

        //p 类

        Class p_class = object_getClass(p);

        // p元类

        Class p_metaClass = object_getClass(p_class);

        // p 根元类

        Class p_rootClass = object_getClass(p_metaClass);

        // p 元类父类

        Class p_superClass = class_getSuperclass(p_metaClass);

        NSLog(@"\n%p LGPerson实例对象\n%p 类\n%p 元类\n%p 根元类 \n%p 元类父类",p, p_class, p_metaClass, p_rootClass, p_superClass);

        

        //t 类

        Class t_class = object_getClass(t);

        // p元类

        Class t_metaClass = object_getClass(t_class);

        // p 根元类

        Class t_rootClass = object_getClass(t_metaClass);

        // p 元类父类

        Class t_superClass = class_getSuperclass(t_metaClass);

        NSLog(@"\n%p LGTeacher实例对象\n%p 类\n%p 元类\n%p 根元类 \n%p 元类父类",t, t_class, t_metaClass, t_rootClass, t_superClass);

        

    }

    return 0;

}

分析代码 LGTeacher 继承与 LGPerson 其中object_getClass 是获取元类的方法 class_getSuperclass 获取父类的方法.我们分别打印出 NSObject、LGPerson、LGTeacher的 对象 类 元类 根元类的地址信息。

2.2结果如下图

image.png

3.结论

isa 的走向: 子类和父类的根元类是指向NSObject的根元类的 NSObject的根元类指向自己. 继承走向: 子类继承父类,父类继承于NSObject 元类继承父类的元类,父类的元类继承于NSObject元类, NSObject元类继承类NSObject走势图如下:

image.png