ios - 类的原理

83 阅读1分钟

我们知道对象的指针指向类 那么类的内存布局是什么样的 对象和类还有哪些关系下面我们来探索下

image.png

  • 在源码环境下我们能看到类的底层结构体
  • 我们稍微归纳下
struct objc_class : objc_object {

    // Class ISA;

    Class superclass;

    cache_t cache;             // formerly cache pointer and vtable

    class_data_bits_t bits;
    
    }
    

image.png

  • cache_t的内存布局算出来为0x20
  • 类的一些方法属性都在class_data_bits_t 这个数据里面
那么类方法 对象方法是如何存储的呢?

isa流程图.png

  • 根据上图 我们可以知道继承和isa 以及元类之间的关系

练习

**BOOL** re1 = [(**id**)[NSObject class] isKindOfClass:[NSObject class]];       //

        **BOOL** re2 = [(**id**)[NSObject class] isMemberOfClass:[NSObject class]];     //

        **BOOL** re3 = [(**id**)[LGPerson class] isKindOfClass:[LGPerson class]];       //

        **BOOL** re4 = [(**id**)[LGPerson class] isMemberOfClass:[LGPerson class]];     //

        NSLog(@" re1 :%hhd\n re2 :%hhd\n re3 :%hhd\n re4 :%hhd\n",re1,re2,re3,re4);

  


        **BOOL** re5 = [(**id**)[NSObject alloc] isKindOfClass:[NSObject class]];       //

        **BOOL** re6 = [(**id**)[NSObject alloc] isMemberOfClass:[NSObject class]];     //

        **BOOL** re7 = [(**id**)[LGPerson alloc] isKindOfClass:[LGPerson class]];       //

        **BOOL** re8 = [(**id**)[LGPerson alloc] isMemberOfClass:[LGPerson class]];     //

        NSLog(@" re5 :%hhd\n re6 :%hhd\n re7 :%hhd\n re8 :%hhd\n",re5,re6,re7,re8);

打印结果 1 0 0 0 1 1 1 1