文章目录- isa指针
- superClass
- 对象的结构体
- 类的结构体
- 分类的结构体
isa指针
OC中任何类的定义都是对象,任何对象都有isa指针。isa是一个Class类型的指针。 实例的isa指针,指向类; 类的isa指针,指向元类; 元类的isa指针,指向根元类; 父元类的isa指针,也指向根元类!! 根元类的isa指针,指向它自己!!
superClass
类的superClass指向父类; 父类的superClass指向根类; 根类的superClass指向nil; 元类的superClass指向父元类; 父元类的superClass指向根元类; 根元类的superClass指向根类!!!!
- 分类不能添加实例变量的原因? 分类结构体不包含实例变量数组, 分类是在依赖runtime加载的。而此时类的内存分布已经确定 (若此时再修改分布情况,对编程性语言是灾难,是不允许的)
- 发送消息的查找过程? 沿着isa指针的方向查找
对象的结构体
代码语言:javascript复制struct objc_object {
Class isa OBJC_ISA_AVAILABILITY; // 指向类对象
};
类的结构体
objc/runtime.h 中 objc_class 结构体的定义:
代码语言:javascript复制struct objc_class {
Class _Nonnull isa; // 指向元类
// 以下 OBJC2_UNAVAILABLE
Class _Nullable super_class; // 父类
const char * _Nonnull name; // 类名
long version; // 类的版本信息,默认为0
long info; // 类信息,供运行期使用的一些标识
long instance_size; // 该类实例变量大小
struct objc_ivar_list * _Nullable ivars; // 该类成员变量数组
struct objc_method_list * _Nullable * _Nullable methodLists; // 方法数组
struct objc_cache * _Nonnull cache; // 方法缓存
struct objc_protocol_list * _Nullable protocols; // 协议数组
};
分类的结构体
objc/runtime.h 中 objc_category 结构体的定义:
代码语言:javascript复制struct objc_category { // OBJC2_UNAVAILABLE
char * _Nonnull category_name;
char * _Nonnull class_name;
struct objc_method_list * _Nullable instance_methods;
struct objc_method_list * _Nullable class_methods;
struct objc_protocol_list * _Nullable protocols;
}