前语

上一篇博客咱们将解了类的加载,这篇文章咱们主要探究一下分类是怎样加载。

分类的结构

  1. 新建QHPerson+QHA分类,然后运行cla算法ng -rewrite-objc QHPerson+QHA.m -o QHPerson+QHA.cpp指令,得到QHPerson+QHA.cpp文件

2.在代码找到了实际上分类也是结构体category_t

struct _category_t {
c源码交易网站源码onst char *name;
struct _class_t *cls;
const struct _method_list_t *instance_methods;
const struct _method_list_t *class_methods;
const struct _protocol_list_t *protocols;
const struct _prop_list_t *properties;
};

其间name:也便是分类的名字,比方QHAcls标明相关的类。还有实例办法类办法协议特征

rwe什么时分初始化

从上一篇博客中知道,加载分类会调用attachCate算法的有穷性是指gories办法,可是加载之前有必要存在rwe

dyld之分类加载
attacGohCateg源码年代ories中咱们相同找到初始化办法cls->data(swiftcode代码查询)->e源码年代训练怎样样xtAllocI算法的时刻复杂度是指什么fNeeded()。也便是在增加分类前会调用。

延伸

除了增加分类,什么时分也会初始化rwe呢?在源码大局查找extAllocIfNeeded工商管理发现动态的增加办法协议特征,都会初始化。
#attachLists算法剖析

void attachLists(List* **const** * addedLists, uint32_t aSwiftddedCount) {
    if (addedC数组指针ount == 0) return;
    if (ha工程造价sArray()) {
      // many lists -&g算法导论t; many lists
      uint32_t oldCount数组初始化 = array源码交易网站源码()->count;
      uint32_t newCount = oldCount + addedCount;
      array_t数组去重 *newArray = (array_t *)malloc(array_t::byteSize(neswifterwCount));
      newArr算法ay->count = newCount;
      array()->count = newCount;
      for (int i = oldCount - 1; i >= 0; i--算法工程师学什么专业)
        newArray->lists[i + addedCount] = array()->lists[i];
      for (unsigned i = 0; i < addedCount; i算法工程师++)
      newArray-源码本钱>lists[i] = addedLists[i];
      free(array());
      setArray(newArray);
      validate();数组c语言
    }工商管理
    else if (!list &swiftcode是什么意思中文& addedCount == 1) {
      // 0 lists源码之家 -> 1 list
      list = addedLists[0];
      valiSwiftdate();
    }
    else {
      // 1 list -> many lists
      Ptr<List> oldList = list;
      uint32_t oldCount = oldList ?宫颈癌早期症状 1 : 0;
      uint32_t newCount = oldCount + addedCount;
      setArray((array_t *)swift国际结算体系malloc(array_t::byteSize(newCswift怎样读ount)));
      arra源码年代训练怎样样y()->count = newCount;
      if (o工商管理ld源码本钱List) array()数组->lists[addedCount] = oldList;
      for (unsigned i = 0; i < addedCount; i++算法的五个特性)
      array()->lists[i] = aswiftcode是什么意思中文ddedLists[i];
      validate();
    }
  }
  • 这个算法分为三种状况
  1. 第一次假定主类的没有办法,swift国际结算体系那么分类的办法之间加进去
  2. 假定主类有办法,而且只需一个分类,那没将主类的办法先放到终究,让后在前面刺进分类的办法
  3. 假定分类有多个,那么先将之前的办法放入数组,让后在前面刺进新的分类办法。

分类办法和主类办法摆放如下图:

dyld之分类加载

不同状况剖析分类的加载状况

下面分不同的状况主类和分类是否有load办法的组合来探究,分类办法是什么时分增加到methods里边

1.主类有load,分类也有load源码年代训练怎样样

realizeClassWithoutS源码年代wift办法增加断点:

dyld之分类加载
发现ro里边并没有分类方Go法,继续实行后库房会发生变化,会经过load_images->loadAllCategories->l算法的时刻复杂度是指什么oad_categories_nolock->attachCategor枸杞ies这样的流程增加分类

2.主类有load,分类没有load

跟踪断点调试:realizeClassWithou算法的五个特性tSwift->methodizeClass-枸杞>attachToClass 并没有调用增加分类的办法

realize算法工程师ClassWithoutSwift检查ro里宫颈癌早期症状面办法的数据:

dyld之分类加载

3.主类没有load,分类有load

跟踪断点调试:realizeClassWithoutSwift-&g龚俊t;methodizeClass->attachToClass 并没有调用增加分类的办法

重复2的操作,发现和2相同,也是在编译阶段就现已加数组的定义入了分类数据

4.主类没有load,分类也没有load

发现直接源码编辑器手机版下载进入了main函数,一切的断点都没有走
dyld之分类加载
然后继续实行:

dyld之分类加载
发现发送音讯的时分会调源码年代用起realizeClassWswiftkeyitho算法工程师utSwift办法去完结,打印ro的值,发现也有分类和类的办法。

总结

经过上面的几种状况swift怎样读剖析,分类的加载分不同的状况,主类和分类是否完结load办法会影算法响分类加载时刻。总的来说假定咱们在分类里边些过多的宫颈癌load办法,会影响dyld的建议程序速度。如无必要咱们尽量削减在主类和分类中增加load办法。等到程序建议后懒加载时再去加载。