美文网首页
isa走位图以及类的结构分析

isa走位图以及类的结构分析

作者: 今年27 | 来源:发表于2022-09-08 10:24 被阅读0次

类的结构

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;  
}

struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

从中我们可以看出objc_classobjc_object继承了一个isa,很容易猜到方法,协议,成员变量是存在bits里面的,那么如何从bits获取信息呢?
根据结构体内存平移的规则,将首地址平移32字节就可以得到bits
而根据class_data_bits_t

struct class_data_bits_t {
    friend objc_class;

    // Values are the FAST_ flags above.
    uintptr_t bits;

    class_rw_t* data() const {
        return (class_rw_t *)(bits & FAST_DATA_MASK);
    }
}

结构体,我们可以知道bits.data()就可以打到class_rw_t数据
这里面就存储这我们想要的信息

struct class_rw_t{
  // Be warned that Symbolication knows the layout of this structure.
    uint32_t flags;
    uint16_t witness;
#if SUPPORT_INDEXED_ISA
    uint16_t index;
#endif

    explicit_atomic<uintptr_t> ro_or_rw_ext;

    Class firstSubclass;
    Class nextSiblingClass;

    const class_ro_t *ro() const {
        auto v = get_ro_or_rwe();
        if (slowpath(v.is<class_rw_ext_t *>())) {
            return v.get<class_rw_ext_t *>()->ro;
        }
        return v.get<const class_ro_t *>();
    }

    void set_ro(const class_ro_t *ro) {
        auto v = get_ro_or_rwe();
        if (v.is<class_rw_ext_t *>()) {
            v.get<class_rw_ext_t *>()->ro = ro;
        } else {
            set_ro_or_rwe(ro);
        }
    }

    const method_array_t methods() const {
        auto v = get_ro_or_rwe();
        if (v.is<class_rw_ext_t *>()) {
            return v.get<class_rw_ext_t *>()->methods;
        } else {
            return method_array_t{v.get<const class_ro_t *>()->baseMethods()};
        }
    }

    const property_array_t properties() const {
        auto v = get_ro_or_rwe();
        if (v.is<class_rw_ext_t *>()) {
            return v.get<class_rw_ext_t *>()->properties;
        } else {
            return property_array_t{v.get<const class_ro_t *>()->baseProperties};
        }
    }

    const protocol_array_t protocols() const {
        auto v = get_ro_or_rwe();
        if (v.is<class_rw_ext_t *>()) {
            return v.get<class_rw_ext_t *>()->protocols;
        } else {
            return protocol_array_t{v.get<const class_ro_t *>()->baseProtocols};
        }
    }
}

可以知道
ro() 存储成员变量
methods() 存储方法列表
properties() 存储属性列表
protocols() 存储协议

接下来说说cache_t
这里面存储的都是

struct cache_t {
#if CACHE_MASK_STORAGE == CACHE_MASK_STORAGE_OUTLINED
    explicit_atomic<struct bucket_t *> _buckets; // 是一个结构体指针类型,占8字节
    explicit_atomic<mask_t> _mask; //是mask_t 类型,而 mask_t 是 unsigned int 的别名,占4字节
#elif CACHE_MASK_STORAGE == CACHE_MASK_STORAGE_HIGH_16
    explicit_atomic<uintptr_t> _maskAndBuckets; //是指针,占8字节
    mask_t _mask_unused; //是mask_t 类型,而 mask_t 是 uint32_t 类型定义的别名,占4字节
    
#if __LP64__
    uint16_t _flags;  //是uint16_t类型,uint16_t是 unsigned short 的别名,占 2个字节
#endif
    uint16_t _occupied; //是uint16_

很容易就可以看出cache_t中存储的是struct bucket_t

struct bucket_t {
private:
    // IMP-first is better for arm64e ptrauth and no worse for arm64.
    // SEL-first is better for armv7* and i386 and x86_64.
#if __arm64__
    explicit_atomic<uintptr_t> _imp;
    explicit_atomic<SEL> _sel;
#else
    explicit_atomic<SEL> _sel;
    explicit_atomic<uintptr_t> _imp;
#endif
}

bucket_t中存储的imp与sel
这有什么用呢?这涉及到方法的快速查找,暂且不表

附上一张isa走位图

isa走位图

相关文章

  • isa走位图以及类的结构分析

    类的结构 从中我们可以看出objc_class从objc_object继承了一个isa,很容易猜到方法,协议,成员...

  • isa 走位&类对象&元类

    经典isa走位图 分析我们实例化的对象因为继承 由objc_object 结构体模板 所以里面 有isa。isa是...

  • iOS 类的结构分析(下)

    在上一篇 iOS 类的结构分析(上) 分析了类的结构、isa 的走位以及类的内存分布(属性列表&实例方法列表),这...

  • 类结构分析

    这片文章主要分析的是类的结构以及对象-类-元类-根元类之间的走位. 一. isa的指向以及类之间的关系 准备工作定...

  • OC 类探索(一)

    一、isa->类和元类 上篇文章分析了对象的isa底层实现以及是如何与cls关联的,这边文章继续分析类的结构。 对...

  • isa相关的经典面试题分析

    前言 书接上回类的结构分析,我们得知isa指针的走位:对象 --> 类 --> 元类 --> 根元类-->根元类 ...

  • iOS 底层原理 - cache_t分析

    cache_t 的基本结构 上之前类的结构分析一篇中,我们知道类的结构为: 也明白了bits,ISA以及super...

  • iOS底层原理07:类 & 类结构分析

    本文的主要目的是分析 类 & 类的结构,整篇都是围绕一个类展开的一些探索 类的分析 类的分析主要是分析 isa的走...

  • Cache_t的结构和原理

    在之间的文章里我们分析了isa的指向和结构isa结构分析,分析了bits类的结构分析,在这篇文章里,我们来分析ob...

  • isa指针指向和类结构分析

    isa指针指向和类结构分析 isa指向图 经典的isa指向图 从这张图能总结出类继承自父类,父类继承于NSObje...

网友评论

      本文标题:isa走位图以及类的结构分析

      本文链接:https://www.haomeiwen.com/subject/avqgnrtx.html