iOS 中 load 和 initialize的实现顺序

1 load 函数

调用时机,当类引用进项目的时候执行load函数,在main函数开始之前,与

这个类是否被用到是无关的,每个类的load函数都会自动调用一次。

  • 1 父类和子类都实现load函数的时候,父类的load方法优先于子类

  • 2 类中的load方法执行顺序优先于类别(Category)

  • 3 当有多个类别(Category)实现load方法时候。会按照顺序执行

  • 4 子类load方法 和 父类load 方法不存在覆盖的现象

执行顺序:父类–> 子类—> 分类

2 initialize 方法

此方法不适用不调用,一旦类文件使用,则第一个调用此方法。

  • 1 父类的initialize 方法会比子类的先执行

  • 2 子类未实现initialize 方法,则会调用父类此方法

  • 3 子类实现initialize方法,则会覆盖父类此方法

  • 4 当多个分类Category,只执行最后一个分类的initialize方法

执行顺序:父类–> 子类

3 原理解读

load 是直接在内存中进行调用

initialize 是通过obj_msg_send 消息机制调用

load 方法是 在运行时时期,循环调用所有类的 +load 方法。直接使用函数内存地址的方式 (*load_method)(cls, SEL_load); 而不是使用发送消息 objc_msgSend 的方式。

具体的实现 还是要月度runtime 源码来看

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...