iOS class

414 阅读1分钟

为了进一步了解oc中类与对象的本质,经过查阅源码总结如下

版本objc4-723

首先看objc_class结构体部分

 struct objc_class : objc_object {
    // Class ISA;
    Class superclass;//指向父类
    cache_t cache; //方法缓存            // formerly cache pointer and vtable
    class_data_bits_t bits; //类信息 通过mask进行与运算获得   // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() {//可读可写的信息,只在稳定状态才有,也就是程序启动和初始化过程中是不存在这个结构体指针 具体见下面源码
        return bits.data();
    }
    void setData(class_rw_t *newData) {
        bits.setData(newData);
    }
。
。
。

进一步查看class_rw_t

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;二维数组,外层method_array_t,内层method_list_t,元素为method_t,类方法的method_list_t在前,类本身方法在后
    property_array_t properties;同上
    protocol_array_t protocols;
    Class firstSubclass;
    Class nextSiblingClass;
    char *demangledName;

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;一维数组,存的都是类固有信息,也就是@interface到@end之间的内容
    protocol_list_t * baseProtocols;同上
    const ivar_list_t * ivars;相对于class_rw_t多了这个,这也可以解释为什么oc不能动态添加ivar,又是readonly又是const-。-!

    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties;

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

细节部分method_t

struct method_t {
    SEL name;
    const char *types;如下图解释
    IMP imp;

以及method_list_t

struct method_list_t : entsize_list_tt<method_t, method_list_t, 0x3> {
    bool isFixedUp() const;
    void setFixedUp();

    uint32_t indexOfMethod(const method_t *meth) const {
        uint32_t i = 
            (uint32_t)(((uintptr_t)meth - (uintptr_t)this) / entsize());
        assert(i < count);
        return i;
    }
};

综上得出下图

最后

文章用于笔者本人学习使用,如有不当之处,希望大佬多多指教,感谢