+(void)load; +(void)initialize;有什么用处?

一,load函数调用特点:

当类被引用进项目的时候就会执行load函数(main函数开始执行之前),与这个类是否被调用无关,每个类的load函数值会自动调用一次,由于load函数是系统自动加载的,因此不需要调用父类的load函数,但是手动调用父类的load也会导致父类的load函数执行

1.当父类和子类都实现load函数时,父类的load执行顺序要优先于子类

2.当子类未实现load方法时,不会执行父类的load方法

3.类中的load方法执行顺序要优先于类别(Category)

4.当有多个类别都实现了load方法,这几个load方法都会执行,但执行顺序是与类别在Compile Sources中出现的顺序一致

5.当然有很多类的时候,每个类的执行顺序也与Compile Sources出现的顺序一致

执行顺序

类在Compile sources中的顺序
二,initialize函数调用特点:

initialize 在类或者其子类的第一个方法被调用前调用,即使类文件被引用进项目,但是没有使用,initialize不会被调用,由于是系统自动调用,也不需要调用[super initialize],否则父类的initialize会被多次执行,假设这段代码并没有被执行,这个函数是不会被执行的

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

2.当子类未实现initialize方法时,会调用父类initialize方法,子类实现initialize方法时,会覆盖父类initialize方法

3.当有多个Category都实现了initialize方法,会覆盖类中的方法,只执行一个(会执行Compile Sources 列表中最后一个Category 的initialize方法)

+initialize 方法会在类第一次接收到消息时调用 objc_msgSend( )。

使用情况

+load

由于调用load方法时的环境很不安全,我们应该尽量减少load方法的逻辑。另一个原因是load方法是线程安全的,它内部使用了锁,所以我们应该避免线程阻塞在load方法中

load很常见的一个使用场景,交换两个方法的实现

+initialize

initialize方法主要用来对一些不方便在编译期初始化的对象进行赋值。比如NSMutableArray这种类型的实例化依赖于runtime的消息发送,所以显然无法在编译器初始化:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值