类的结构分析(上)

类的结构分析

isa的指向

我们有一个对象LGPerson,继承NSObject
我们来打印一下isa的情况

    // NSObject实例对象
    LGPerson *object1 = [LGPerson alloc];
    // NSObject类
    Class class = object_getClass(object1);
    // NSObject元类
    Class metaClass = object_getClass(class);
    // NSObject根元类
    Class rootMetaClass = object_getClass(metaClass);
    // NSObject根根元类
    Class rootRootMetaClass = object_getClass(rootMetaClass);
    NSLog(@"\n%p 实例对象\n%p 类\n%p 元类\n%p 根元类\n%p 根根元类",object1,class,metaClass,rootMetaClass,rootRootMetaClass);
复制代码

截屏2021-06-18 上午7.04.15.png

从中可以得出isa的指向:实例对象->类->元类->根元类->根根元类

如下图表示
截屏2021-06-18 上午7.13.40.png

疑问:怎么知道0x100008240是元类呢,
我们打开MacOView,在symbloTable中搜索class

截屏2021-06-18 上午7.21.12.png
元类是编译时自动生成的,并没有提供给外界使用。

继承关系

我们来看一下继承关系:

类的继承:
// LGPerson元类
    Class pMetaClass = object_getClass(LGPerson.class);
    Class psuperClass = class_getSuperclass(pMetaClass);
    NSLog(@"%@ - %@",pMetaClass,psuperClass);
    LGPerson - NSObject
复制代码
元类的继承

元类也是类,元类也有继承关系,我们写一个LGTeacher继承与LGPerson

@interface LGTeacher : LGPerson

@end
复制代码
    Class tMetaClass = object_getClass(LGTeacher.class);
    Class tsuperClass = class_getSuperclass(tMetaClass);
    Class tsuperClass01 = class_getSuperclass(tsuperClass);
    Class tsuperClass00 = class_getSuperclass(tsuperClass01);
    Class tsuperClass000 = class_getSuperclass(tsuperClass00);
  NSLog(@"\n%@ - %p元类\n %@-%p父元类\n %@- %p根元类\n %@- %p根元类super \n  %@--%p",tMetaClass, tMetaClass, tsuperClass,tsuperClass, tsuperClass01,tsuperClass01, tsuperClass00, tsuperClass00, tsuperClass000,tsuperClass000);

复制代码

结果如下
截屏2021-06-18 上午7.50.20.png
从打印结果中可以看出,根元类的父类是NSObject,Superclass(null)–0x0
验证根类特殊情况

 // NSObject 根类特殊情况
    Class nsuperClass = class_getSuperclass(NSObject.class);
    NSLog(@"%@ - %p",nsuperClass,nsuperClass);
     (null)--0x0
复制代码
// 根元类 -> NSObject
    Class rnsuperClass = class_getSuperclass(tsuperClass01);
    NSLog(@"%@ - %p",rnsuperClass,rnsuperClass);
    NSObject - 0x7fff808b0388
    
复制代码

继承关系图如下:

截屏2021-06-18 上午8.00.47.png

总的流程如下:

isa流程图.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享