为了进一步了解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;
}
};
综上得出下图
最后
文章用于笔者本人学习使用,如有不当之处,希望大佬多多指教,感谢