对象的代码块
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Objective-C的对象就是一个包含isa指针的数据结构,而isa又是一个Class类型的,Class则是一个名为objc_class的数据结构定义。
runtime.h中对objc_class的定义:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
// 父类
Class super_class OBJC2_UNAVAILABLE;
// 类名
const char *name OBJC2_UNAVAILABLE;
// 类版本信息
long version OBJC2_UNAVAILABLE;
// 类信息
long info OBJC2_UNAVAILABLE;
// 类实例变量大小
long instance_size OBJC2_UNAVAILABLE;
// 类成员变量列表
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
// 类方法列表
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
// 类方法缓存
struct objc_cache *cache OBJC2_UNAVAILABLE;
// 类协议列表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
作者:iEzreal
链接:https://www.jianshu.com/p/7edece26de7f
isa:在Objective-C中,类自身也是一个对象,这个对象的isa指针指向metaClass(元类)
super_class:指向该类的父类,如果该类已经是最顶层的根类(如NSObject或NSProxy),则super_class为NULL。
cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。在实际使用中,这个对象只有一部分方法是常用的,很多方法其实很少用或者根本用不上。这种情况下,如果每次消息来时,我们都是methodLists中遍历一遍,性能势必很差。这时,cache就派上用场了。在我们每次调用过一个方法后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果cache没有,才去methodLists中查找方法。这样,对于那些经常用到的方法的调用,但提高了调用的效率。
version:我们可以使用这个字段来提供类的版本信息。这对于对象的序列化非常有用,它可是让我们识别出不同类定义版本中实例变量布局的改变。
元类(Meta Class)
元类存储着一个类的所有类方法,当我们向一个对象发送消息时,runtime会在这个对象所属的这个类的方法列表中查找方法;而向一个类发送消息时,会在这个类的meta-class的方法列表中查找。
网友评论