文章目录
- initialize的调用:
- 通过runtime的消息发送机制来调用
- 调用子类的initialize之前,会先调用父类的initialize.
- 会在类第一次收到消息的时候调用,如果这个类不被调用,那么就永远不会调用initialize.
- 如果子类没有实现+initialize,会调用父类+initialize(所以父类的+initialize可能会被调用多次)
- 如果分类实现了+initialize,就覆盖类本身的+initialize调用(因为走的是objc_msgSend)
1. +initialize
1. initializeNonMetaClass
递归找到子类的父类
- callInitialize
2. 面试题
1. +load , + initalize方法的区别是什么?
- 调用方式
load是根据函数地址直接调用
initalize是通过objc_msgSend调用
- 调用时刻
load是runtime加载类,分类的时候调用(只会调用一次)
initalize是类第一次接受到消息的时候调用,每一个类只会initalize一次(如果子类没有实现+initalize方法,那么会调用父类的initalize方法,所以父类initalize会被调用多次)
2. load,initalize的调用方法
load
- 先调用类的load
- 先编译的类,优先调用load
- 调用子类的load之前,会先调用父类的load
- 再调用分类的load
- 先编译的分类,优先调用load
- initalize
- 先初始化父类
- 再初始化子类