iOS 类的结构分析

2019-12-26  本文已影响0人  Joker_King

在iOS开发中,类使我们最常接触的一个名词,那么它到底是什么呢?它内部的结构如何。我们通过点击查看Class可知

typedef struct objc_class *Class;

Class其实是一个objc_class的结构体。
那么objc_class又是什么呢,我们来继续探索。

struct objc_class : objc_object {
    // Class ISA; 
    Class superclass; 
    cache_t cache;       // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t 和一些自定义的标识。
//。。。。其他的省略
}

通过源码查看得知,objc_class是一个继承于objc_object的结构体。

/// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

objc_class通过继承objc_object获得了其中唯一的isa成员变量。

class_rw_t部分代码

struct class_rw_t {
    // Be warned that Symbolication knows the layout of this structure.
//...省略
    const class_ro_t *ro;

    method_array_t methods; //实例方法
    property_array_t properties; //属性
    protocol_array_t protocols; //协议
//...省略
}

class_rw_t是通过bits调用data方法得来的,我们来到data方法内部实现。我们可以看到,data函数内部仅仅对bits进行&FAST_DATA_MASK操作。

#define FAST_DATA_MASK          0x00007ffffffffff8UL
class_rw_t* data() {
    return (class_rw_t *)(bits & FAST_DATA_MASK);
}

我们通过查看class_ro_t的源码得知,成员变量信息是存储在这里的。

struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize;//实例对象大小
#ifdef __LP64__
    uint32_t reserved;
#endif

    const uint8_t * ivarLayout;
    
    const char * name;
    method_list_t * baseMethodList;
    protocol_list_t * baseProtocols;
    const ivar_list_t * ivars;//成员变量

    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties;

    method_list_t *baseMethods() const {
        return baseMethodList;
    }
};

得出如下图总结


类的结构
上一篇 下一篇

猜你喜欢

热点阅读