Runtime-Class
2021-03-11 本文已影响0人
磊Se
Class的本质
objc_object 实例对象
如下代码,创建的实例对象,其实是objc_object结构体。Runtime会通过结构体里面的isa
指针找到对应的Class。
//实例对象
struct objc_object {
//指向当前类结构体(objc_class)
Class isa OBJC_ISA_AVAILABILITY;
};
objc_class 类
类结构体(objc_class)的作用就是实例对象(objc_object)调用的实例方法和实例属性都会在这里。如下类结构体的代码结构;
//类
struct objc_class {
//指向元类(MetaClass),类型也是 objc_class(主要存放对应的类属性和方法)
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
//指向父类(objc_class)
Class _Nullable super_class OBJC2_UNAVAILABLE;
//类名
const char * _Nonnull name OBJC2_UNAVAILABLE;
//版本号
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
//实例对象大小
long instance_size OBJC2_UNAVAILABLE;
//变量列表(Category不支持添加变量)
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;
//方法列表(指针的指针)
struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;
//方法缓存列表(调用过的方法会缓存起来方便下次快速调用)
struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;
//遵守的协议列表
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
Meta Class 元类
objc_class类里的isa
指针指向的是Meta Class(元类),而Meta Class其实本质上也是对应的objc_class
结构体。不过Meta Class存储的属性和方法都是类方法和类成员属性。
每个Class的Meta Class中 isa
指针指向NSObject
的Meta Class(即指向根类的的元类)。
NSObject(根类)
的元类的isa
指针指向自己。
如下图:
