iOS - 分类中方法的调用顺序

    前几日看老司机专栏发布过一篇文章-iOS 上修改私有方法的几种方式解析,文章中提到了我们通常修改一个类私有方法的方式有以下四种:

  • 通过创建 Category 复写,这种方式简单而粗暴。
  • 通过 void method_exchangeImplementations(Method m1, Method m2) 等类似方式实现 Method Swizzling,也就是所谓 的黑魔法。
  • 通过第三方框架 Aspects 来修改私有方法,对于项目内有强 AOP 编程需求的很可能会选择这个方式。
  • 通过Facebook开源的 Fishhook 对 C 语言方法进行了 Hook 的方式,它在逆向技术中占据了很大的作用。OC 的消息转发机制是依赖于 C 函数 objc_msgSend ,那么在一些特殊需求需要直接 Hook C 函数的话,Fishhook 就会派上用场了。

从而想到了总结下iOS在多个Category重名时,方法的调用这么一篇文章。

本文主要侧重于解决以下几个问题:

  1. 主类和分类中普通方法的调用顺序?
  2. 同一个主类的两个分类中的同名方法调用顺序?
  3. 分类中 +load 方法的调用顺序?
  4. 分类中 +initialize 方法的调用顺序?

准备工作

新建一个workspace工程,我创建了一个TestDemo工程然后创建对主类MyClass创建了几个分类了

主类、子类和分类中的+ (void)load方法的调用顺序

在主类和子类、分类中重写+load方法

  1. 情形一
  2. 情形二
  3. 情形三
  4. 情形四
    结论:
    1. 主类和子类、分类的都会主动调用 +load 方法
    2. 主类和子类加载顺序与编译顺序无关,调用优先级为父类优先于子类
    3. 分类间的加载顺序取决于编译的顺序:编译在前则先加载, 编译在后则后加载。
    4. 父类、子类、分类的加载顺序为:父类优先于子类,子类优先于分类(父类>子类>分类)