前言
先放上苹果官方的isa走位以及继承图,表示敬畏。
元类
1.找到元类
先找到元类,先查看类LQTeacher的地址,通过LQTeacher的地址找到LQTeacher的isa,通过isa获取到里面存储的内指针,得到一个新的地址,po查看发现也是LQTeacher类,这个就是我们的元类了!
2.总结
- 元类是系统自动创建的,和关联类同名。
- 对象的isa指向类,类对象的isa指向元类
类和元类的继承关系
1.废话不多说,先上代码!代码里面创建了两个类,一个LQPerson和一个LGTeacher,LQTeacher继承LQPerson。然后分别测试类和元类的继承关系!
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <Foundation/Foundation.h>
@interface LQPerson : NSObject
@end
@implementation LQPerson
@end
@interface LQTeacher : LQPerson
@end
@implementation LQTeacher
@end
#pragma mark - 继承链分析
void testSuperClass(id class){
Class cls = class;
Class superCls = class_getSuperclass(cls);
Class rootSuperClass = class_getSuperclass(superCls);
NSLog(@"类:%@_%p",cls,cls);
NSLog(@"父类:%@_%p",superCls,superCls);
NSLog(@"父类:%@_%p",rootSuperClass,rootSuperClass);
NSLog(@"----------");
}
#pragma mark - 元类继承链分析
void testMetaClass(id class){
Class cls = class;
Class metaClass = object_getClass(cls);
NSLog(@"类:%@_%p",cls,cls);
NSLog(@"元类:%@_%p",metaClass,metaClass);
testSuperClass(metaClass);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"类继承探究:");
testSuperClass(LQTeacher.class);
testSuperClass(LQPerson.class);
testSuperClass(NSObject.class);
NSLog(@"元类继承探究:");
testMetaClass(LQTeacher.class);
testMetaClass(LQPerson.class);
testMetaClass(NSObject.class);
}
return 0;
}
复制代码
2.测试运行结果
3.总结
类的继承图和元类的继承图
ISA走位
1.测试案例
#pragma mark - ISA走位
void testSuperIsa(id obj){
Class isa = object_getClass(obj);
Class metaIsa = object_getClass(isa);
Class rootMetaIsa = object_getClass(metaIsa);
NSLog(@"对象:%@_%p",obj,obj);
NSLog(@"对象的isa-->%@_%p",isa,isa);
NSLog(@"类的isa-->%@_%p",metaIsa,metaIsa);
NSLog(@"元类isa-->%@_%p",rootMetaIsa,rootMetaIsa);
NSLog(@"----------");
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"ISA继承探究:");
NSLog(@"LQTeacher类:%@_%p",LQTeacher.class,LQTeacher.class);
NSLog(@"LQPerson类:%@_%p",LQPerson.class,LQPerson.class);
NSLog(@"NSObject类:%@_%p",NSObject.class,NSObject.class);
NSLog(@"----------");
testSuperIsa(LQTeacher.new);
testSuperIsa(LQPerson.new);
testSuperIsa(NSObject.new);
}
return 0;
}
复制代码
2.测试结果
3.总结
- 对象的isa指向类
- 类的isa指向元类
- 元类的isa指向根元类
- 根元类的isa指向自己
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END