iOS +(void)initinstance 与 +(void)load 区别

先看下面表格两者的区别,后续会继续介绍

  +load +initialize
调用时机 被添加runtime时 收到第一条消息时,可能永远不调用
调用顺序 父类->子类->分类 父类->子类
调用次数 1次 多次
是否需要显示调用父类实现
是否沿用父类的实现
分类中的实现 类和分类都执行  

相同点:

  1. 系统都执行一次。

  2. 假如父类和子类都被调用,父类在子类之前被调用

不同点:

扫描二维码关注公众号,回复: 6056180 查看本文章
  1. load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + load 方法。

  2. +initialize 这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量

  3. load 会在main()函数之前调用。initialize 则在类实例化 或 类方法被调用时调用;

  4. 如果子类中没有initialize方法,则会再次调用父类的initialize方法,类别会覆盖主类的initialize,load则不会被覆盖

  5. load顺序在 initialize之前;

  6.  •  initialize 方法的调用看起来会更合理,通常在它里面写代码比在 + load 里写更好,因为它是懒调用的,也有可能完全不被调用。类第一次被加载时,

  7. 类接收消息时,运行时会先检查 + initialize 有没有被调用过。如果没有,会在消息被处理前调用

--->>>>
initialize 最终是通过 objc_msgSend 来执行的,objc_msgSend 会执行一系列方法查找,并且 Category 的方法会覆盖类中的方法
load 是在被添加到 runtime 时开始执行,父类最先执行,然后是子类,最后是 Category。又因为是直接获取函数指针来执行,不会像 objc_msgSend 一样会有方法查找的过程。

---->>>>

猜你喜欢

转载自blog.csdn.net/u011217834/article/details/89668782