iOS底层原理:isa走位以及继承关系

前言

先放上苹果官方的isa走位以及继承图,表示敬畏。

bgview的副本.png

元类

1.找到元类

先找到元类,先查看类LQTeacher的地址,通过LQTeacher的地址找到LQTeacher的isa,通过isa获取到里面存储的内指针,得到一个新的地址,po查看发现也是LQTeacher类,这个就是我们的元类了!

bgview的副本.png

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.测试运行结果

image.png

3.总结

类的继承图和元类的继承图
image.png

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.测试结果

image.png

3.总结

  1. 对象的isa指向类
  2. 类的isa指向元类
  3. 元类的isa指向根元类
  4. 根元类的isa指向自己
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享