load、initialize方法的区别什么?在继承关系中他们有什么区别

本文深入探讨了Objective-C中类的`load`和`initialize`方法的调用机制。`load`方法在类装载时被调用,遵循编译源文件的顺序,并优先调用父类的方法。而`initialize`则在类或子类首次接收到消息时调用,采用`objc_msgSend`方式,先调用父类的initialize。文章通过实例详细解析了这两个方法的调用顺序和特点。
摘要由CSDN通过智能技术生成

load:当类被装载的时候被调用,只调用一次

调用方式并不是采用runtime的objc_msgSend方式调用的,而是直接采用函数的内存地址直接调用的 多个类的load调用顺序,是依赖于compile sources中的文件顺序决定的,根据文件从上到下的顺序调用 子类和父类同时实现load的方法时,父类的方法先被调用 本类与category的调用顺序是,优先调用本类的(注意:category是在最后被装载的) 多个category,每个load都会被调用(这也是load的调用方式不是采用objc_msgSend的方式调用的),同样按照compile sources中的顺序调用的 load是被动调用的,在类装载时调用的,不需要手动触发调用 注意:当存在继承关系的两个文件时,不管父类文件是否排在子类或其他文件的前面,都是优先调用父类的,然后调用子类的。

例如:compile sources中的文件顺序如下:SubB、SubA、A、B,load的调用顺序是:B、SubB、A、SubA。

分析:SubB是排在compile sources中的第一个,所以应当第一个被调用,但是SubB继承自B,所以按照优先调用父类的原则,B先被调用,然后是SubB,A、SubA。

第二种情况:compile sources中的文件顺序如下:B、SubA、SubB、A,load调用顺序是:B、A、SubA、SubB,这里我给大家画个图梳理一下:

image.png

initialize:当类或子类第一次收到消息时被调用(即:静态方法或实例方法第一次被调用,也就是这个类第一次被用到的时候),只调用一次

调用方式是通过runtime的objc_msgSend的方式调用的,此时所有的类都已经装载完毕

子类和父类同时实现initialize,父类的先被调用,然后调用子类的

本类与category同时实现initialize,category会覆盖本类的方法,只调用category的

initialize一次(这也说明initialize的调用方式采用objc_msgSend的方式调用的)

initialize是主动调用的,只有当类第一次被用到的时候才会触发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值