iOS 中 load 和 initialize的实现顺序

本文深入探讨Objective-C中类的加载机制,包括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 源码来看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值