类的结构分析
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);
复制代码
从中可以得出isa的指向:实例对象->类->元类->根元类->根根元类
如下图表示
疑问:怎么知道0x100008240是元类呢,
我们打开MacOView,在symbloTable中搜索class
元类是编译时自动生成的,并没有提供给外界使用。
继承关系
我们来看一下继承关系:
类的继承:
// 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);
复制代码
结果如下
从打印结果中可以看出,根元类的父类是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
复制代码
继承关系图如下:
总的流程如下:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END