美文网首页
底层原理总结 — 窥探Class的结构

底层原理总结 — 窥探Class的结构

作者: 踩坑小分队 | 来源:发表于2020-02-08 21:31 被阅读0次

    在Xcode中,点击Class直接跳转

    typedef struct objc_class *Class;
    

    发现Class就是一个结构体objc_class类型的指针

    struct objc_class {
        Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
    
    #if !__OBJC2__
        Class _Nullable super_class                              OBJC2_UNAVAILABLE;
        const char * _Nonnull name                               OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
        struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
        struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
    #endif
    
    } OBJC2_UNAVAILABLE;
    

    看到class中包含,isa指针,版本,类名,方法列表,协议列表,等等。
    发现除了isa,其他的已经过期了。我们来看一下最新的objc的源码的方法之类的列表都是怎么获取的

    objc下载源码:https://opensource.apple.com/tarballs/objc4/
    下载下面最新的代码,打开

    image.png

    找到objc_class结构体的实现


    image.png

    objc_class继承自objc_objc_object
    变量只有一个isa


    image.png

    我们来看下

    image.png
    class_rw_t
    这个结构体中就存放了class的方法,属性,协议等相关信息
    struct class_rw_t {
        // Be warned that Symbolication knows the layout of this structure.
        uint32_t flags;
        uint32_t version;
    
        const class_ro_t *ro;
    
        method_array_t methods;
        property_array_t properties;
        protocol_array_t protocols;
    
        Class firstSubclass;
        Class nextSiblingClass;
    
        char *demangledName;
    
    #if SUPPORT_INDEXED_ISA
        uint32_t index;
    #endif
    
        void setFlags(uint32_t set) 
        {
            OSAtomicOr32Barrier(set, &flags);
        }
    
        void clearFlags(uint32_t clear) 
        {
            OSAtomicXor32Barrier(clear, &flags);
        }
    
        // set and clear must not overlap
        void changeFlags(uint32_t set, uint32_t clear) 
        {
            assert((set & clear) == 0);
    
            uint32_t oldf, newf;
            do {
                oldf = flags;
                newf = (oldf | set) & ~clear;
            } while (!OSAtomicCompareAndSwap32Barrier(oldf, newf, (volatile int32_t *)&flags));
        }
    }
    

    如何获取到这些信息的呢?

    class_data_bits_t bits;    // 用于获取具体的类信息
    
        class_rw_t *data() { 
            return bits.data();
        }
    
        class_rw_t* data() {
            return (class_rw_t *)(bits & FAST_DATA_MASK);
        }
    

    最终的结构如下:


    image.png

    相关文章

      网友评论

          本文标题:底层原理总结 — 窥探Class的结构

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