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

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

 

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

 

相同点:

 

  1. 系统都执行一次。

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

 

不同点:

 

 

  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 一样会有方法查找的过程。

 

---->>>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值