在讨论之前先谈一下实例对象、类对象、元类对象
Person * p = [[Person alloc]init];
Class p1 = [Person class];
Class p2 = p.class;
Class p3 = objc_getClass(p)
上面 p1 p2 p3 内存地址是相同的因为他们都是只有一个类对象
Class p4 = objc_getClass(p1); ///元类
实例对象:类初始化出来的对象叫实例对象
类对象:元类初始化出来的东西叫类对象
元类对象:元类是类对象所属的类,是比较虚拟的系统帮我们实现
元类对象的归属是Root_metaclass 根元类,根元类的归属是自己
isa走位图
isa:oc里面对象的定义是objc_object,他里面包含了一个isa指针那么那个isa是一个isa_t类型的联合体(union,比较优秀的数据结构节省资源。数据共享一片内存),
objc_class
oc里面类的基本实现是objc_class,他继承objc_object
image.png
isa占用8字节,superclass占用8字节内存,cache占用16字节内存,最重要的核心是bits,因为他里面包含了class_rw_t数据
class_rw_t
image.png
method_array_t、property_array_t、protocol_array_t他们都继承list_array_tt,这个list_array_tt是一个类,他里面有三个属性protected、private、public,当我们对方法或属性协议进行声明时不同的权限会放入不同的区域,来进行区分,还有一个只读属性class_ro_t,只读属性一旦声明不能被外界更改所以存在另一个结构体里
image.png