本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !
class结构中最重要的属性就是isa指针
在arm64架构之前,存储了ISA指针指向对象的内存地址,但是在arm64之后需要在存储地址值&ISA_MASK 这个值才是指向对象的内存地址。示意图如下
QQ20200326-104436@2x.pngobjc4源码地址
QQ20200326-104412@2x.png窥探struct object_class的结构
简化(去掉方法定义,保留属性)后的源码
objc-private.h
struct objc_object {
private:
isa_t isa;
};
objc-runtime-new.h
这个结构体中包含的是类的原始信息,是不允许修改的
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;
}
这个结构体中包含的是程序员手动给类添加的信息,是可读可写的
struct class_rw_t {
// Be warned that Symbolication knows the layout of this structure.
uint32_t flags;
uint16_t version;
uint16_t witness;
const class_ro_t *ro;
method_array_t methods;
property_array_t properties;
protocol_array_t protocols;
Class firstSubclass;
Class nextSiblingClass;
char *demangledName;
}
Class的底层结构
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 (class_rw_t *)(bits & FAST_DATA_MASK);
}
*/
class_rw_t *data() const {
return bits.data();
}
};
图解
class底层结构@2x.png
网友评论