objc_object & objc_class的区别
objc_object
对应对象
,是对象
在底层的的数据结构
。objc_class
对应类
,是类
在底层的数据结构
id
为objc_object指针
的别名
typedef struct objc_object *id;`
复制代码
class
为objc_class指针
的别名
typedef struct objc_class *Class;
复制代码
objc_class
继承于objc_object
,万物皆对象
struct objc_class : objc_object {
复制代码
isa
源码分析
探究objc_object,我们知道objc_object
在内存中由isa_t isa
和成员变量
构成。
查看isa_t的源码
union isa_t {
uintptr_t bits;
private:
Class cls;
public:
#if defined(ISA_BITFIELD)
struct {
ISA_BITFIELD; // defined in isa.h
};
#endif
};
复制代码
- isa是个
联合体(共用体)
- isa在新版内存优化后,通过
位域
的方式,由原来64位
单纯作为类指针变为剩余空间可以存放其它信息。例如在x86架构下,中间44位是存放类指针地址,其它为存放了关联对象信息、弱引用、散列表等信息,更大限度的节省内存空间
。 - 其中
ISA_MASK
作为掩码
,在ISA_BITFIELD位域的冗余信息
中过滤出shiftcls
,类指针的值.
define ISA_MASK 0x00007ffffffffff8ULL
define ISA_BITFIELD
uintptr_t nonpointer : 1;
uintptr_t has_assoc : 1;
uintptr_t has_cxx_dtor : 1;
uintptr_t shiftcls : 44;
uintptr_t magic : 6;
uintptr_t weakly_referenced : 1;
uintptr_t unused : 1;
uintptr_t has_sidetable_rc : 1;
uintptr_t extra_rc : 8
复制代码
我们可以看到他们的流程
喜欢就支持一下吧
相关推荐