当前位置: 代码迷 >> 综合 >> IOS----runtime class
  详细解决方案

IOS----runtime class

热度:59   发布时间:2024-03-08 05:28:03.0

看源码

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 * plus custom rr/alloc flags

    class_rw_t *data() const {

        return bits.data();

    }

.........................

}

cache_t cache;  方法缓存; class_data_bits_t bits; 用于获取到具体类的信息。

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;

 

private:

    using ro_or_rw_ext_t = objc::PointerUnion<const class_ro_t *, class_rw_ext_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;

 

    // This field exists only when RO_HAS_SWIFT_INITIALIZER is set.

    _objc_swiftMetadataInitializer __ptrauth_objc_method_list_imp _swiftMetadataInitializer_NEVER_USE[0];

 

    _objc_swiftMetadataInitializer swiftMetadataInitializer() const {

        if (flags & RO_HAS_SWIFT_INITIALIZER) {

            return _swiftMetadataInitializer_NEVER_USE[0];

        } else {

            return nil;

        }

    }

 

    method_list_t *baseMethods() const {

        return baseMethodList;

    }

 

    class_ro_t *duplicate() const {

        if (flags & RO_HAS_SWIFT_INITIALIZER) {

            size_t size = sizeof(*this) + sizeof(_swiftMetadataInitializer_NEVER_USE[0]);

            class_ro_t *ro = (class_ro_t *)memdup(this, size);

            ro->_swiftMetadataInitializer_NEVER_USE[0] = this->_swiftMetadataInitializer_NEVER_USE[0];

            return ro;

        } else {

            size_t size = sizeof(*this);

            class_ro_t *ro = (class_ro_t *)memdup(this, size);

            return ro;

        }

    }

};

 

struct class_rw_ext_t {

    const class_ro_t *ro;

    method_array_t methods;

    property_array_t properties;

    protocol_array_t protocols;

    char *demangledName;

    uint32_t version;

};

二维数组

class method_array_t :

    public list_array_tt<method_t, method_list_t>

{

    typedef list_array_tt<method_t, method_list_t> Super;

 

public:

    method_array_t() : Super() { }

    method_array_t(method_list_t *l) : Super(l) { }

 

    method_list_t * const *beginCategoryMethodLists() const {

        return beginLists();

    }

    

    method_list_t * const *endCategoryMethodLists(Class cls) const;

 

    method_array_t duplicate() {

        return Super::duplicate<method_array_t>();

    }

};

 

 

class property_array_t :

    public list_array_tt<property_t, property_list_t>

{

    typedef list_array_tt<property_t, property_list_t> Super;

 

public:

    property_array_t() : Super() { }

    property_array_t(property_list_t *l) : Super(l) { }

 

    property_array_t duplicate() {

        return Super::duplicate<property_array_t>();

    }

};

 

 

class protocol_array_t :

    public list_array_tt<protocol_ref_t, protocol_list_t>

{

    typedef list_array_tt<protocol_ref_t, protocol_list_t> Super;

 

public:

    protocol_array_t() : Super() { }

    protocol_array_t(protocol_list_t *l) : Super(l) { }

 

    protocol_array_t duplicate() {

        return Super::duplicate<protocol_array_t>();

    }

};

 

 

  相关解决方案