面试题load、initialize

load在main函数之前执行,程序一启动runtime会加载类信息载入内存,相当于知道了这个类,但是没有初始化,只会调用1次,分类的load会先调用类的load

initialize是类载第一次接收到消息的时候调用,相当于类的单例初始化,objc_msgSend内部会判断是否初始化,如果没有会判断父类是否初始化,如果没有就先调用父类的initialize,然后调用自己的initialize;
如果没有子类没有实现initialize,objc_msgSend会根据消息发送机制去调用父类的initialize;

load、initialize方法的区别什么?
1.调用方式
1> load是根据函数地址直接调用
2> initialize是通过objc_msgSend调用

2.调用时刻
1> load是runtime加载类、分类的时候调用(只会调用1次)
2> initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次)

load、initialize的调用顺序?
1.load
1> 先调用类的load
a) 先编译的类,优先调用load
b) 调用子类的load之前,会先调用父类的load

2> 再调用分类的load
a) 先编译的分类,优先调用load

2.initialize
1> 先初始化父类
2> 再初始化子类(可能最终调用的是父类的initialize方法)

你可能感兴趣的:(面试题load、initialize)