isa 指针,表示这个对象是一个什么类。而 Class 类型, 也就是 struct objc_class * ,这是苹果在下面的注释中写到的。这说明类本身也是一个对象。在类对象中的 isa 指向的类叫做“元类”,类方法就定义在元类中。总的来说就是,一个类可以有很多的实例,这些实例有着唯一的一个类对象,而这个类对象也有着唯一的一个元类。
实例,类,父类,元类之间的关系Class super_class
super_class 指向的就是它的父类。
struct objc_ivar_list *ivars
ivars 指向的是成员变量的列表。
struct objc_method_list **methodLists
methodLists 指向的就是方法的列表。在 method_list 中存着 objc_method 类型的数组。而 objc_method 的定义如下:
struct objc_method {
SEL method_name ;
char *method_types ;
IMP method_imp ;
}
typedef id (*IMP)(id, SEL, ...); // IMP 就是一个函数指针
看到这个结构体, 我们应该就很明确 selector 的意义了:selector 其实就是方法的一个标示,而 method_imp 指向的才是真正的函数实现。当我们向对象发送消息后, runtime根据 selector 这个标示,在method_list中找到对应的 objc_method,取到真正的函数的地址,再执行。
struct objc_cache *cache
cache 用来缓存最近调用过的的方法。 如果每次向对象发送消息都要遍历一遍方法列表那会很浪费时间, 所以会把最近调用过的方法放在缓存中。每一次发送消息时,会先查询缓存,缓存中找不到再去方法列表中找。
struct objc_protocol_list *protocols
protocols 指向协议列表。
网友评论