load 和 initialize比较

1.load 在类或者类目被添加到runtime的时候加载一次,initialize是类第一次收到消息的时候被加载,load是在main函数之前,initialize是在main函数之后

2.load方法的调用顺序是:superClass -> class -> category;initialize方法的调用顺序是:superClass -> class。都不需要显示调用父类的方法,系统会自动调用,load方法是函数指针调用,initialize是发送消息。子类如果没有实现load函数,子类是不会调用父类的load函数的,但是子类没有实现initialize函数,则会调用父类的initialize函数。

3.load和initialize内部实现都加了线程锁,是线程安全的,因此,这两个函数应该做一些简单的工作,不适合复杂的工作。

4.load函数通常用来进行Method Swizzle,initialize函数则通常初始化一些全局变量,静态变量。

5. initialize函数的调用顺序为:superClass -> class。这里没有分类,因为一个类的initialize函数只会调用一次,如果需要实现独立的class和category的初始化就需要实现load函数。还需要注意的一点就是,如果subClass没有实现initialize函数,则父类的initialize函数会被调用两次。
load函数的调用直接是函数指针的调用,而initialize函数是消息的转发。所以,class的子类就算没有实现initialize函数,也会调用父类的initialize函数,如果子类实现了initialize函数,则子类不会调用父类的initialize函数
由于initialize函数可能会被调用多次,所以,如果想保证initialize函数只被调用一次,苹果建议这样做,类似懒加载:
+ (void)initialize {
  if (self == [ClassName self]) {
    // ... do the initialization ...
  }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值