Runtime - class

2019-08-14  本文已影响0人  大白菜s

runtime源码中objc_class定义:

struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache;             // 方法缓存
class_data_bits_t bits;    // 具体的类信息

class_rw_t *data() { 
    return bits.data();
  }
}
class结构
class_rw_t

class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容、分类的内容


class_rw_t

class_ro_t里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的,包含了类的初始内容


class_ro_t

method_t是对方法\函数的封装

method_t
cache_t
Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,可以提高方法的查找速度

回顾方法调用过程:调用方法的时候,需要去方法列表里面进行遍历查找。如果方法不在列表里面,就会通过superclass找到父类的类对象,在去父类类对象方法列表里面遍历查找。

如果方法需要调用很多次的话,那就相当于每次调用都需要去遍历多次方法列表,为了能够快速查找方法,apple设计了cache_t来进行方法缓存。
每当调用方法的时候,会先去cache中查找是否有缓存的方法,如果没有缓存,在去类对象方法列表中查找,以此类推直到找到方法之后,就会将方法直接存储在cache中,下一次在调用这个方法的时候,就会在类对象的cache里面找到这个方法,直接调用了。


cache_t
上一篇 下一篇

猜你喜欢

热点阅读