+(void)load、+(void)initialize简单总结

主要问题:

load、initialize方法的区别是什么?它们在category中的调用顺序?以及出现继承时它们之间的调用过程?

load、initialize方法的区别:

1、调用方式
   1>load是根据函数地址调用
   2>initialize是通过objc_msgSend调用
2、调用时刻
   1>load是runtime加载类、分类的时候调用(只会调用一次)
   2>initialize是类第一次接收消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)

category中的调用顺序

1、load
   1>先调用类的load(先编译的类先调用load,调用子类的load之前调用父类的load)
   2>在调用分类的load(先编译的分类先调用load)
2、initialize
   1>先初始化父类的initialize
   2>再初始化子类的initialize(可能最终调用的父类的initialize)

load

每个类、分类 的load方法,在程序运行过程中只调用一次
调用顺序:
1、先调用类的load,按照编译先后顺序调用(先编译先调用),调用子类的load之前会先调用父类的load
2、在调用分类的load,按照编译先后顺序调用(先编译先调用)

initialize

在类第一次接收到消息的时候调用,且该类的initialize只调用一次

推荐阅读更多精彩内容