1. Category实现原理
- Category编译之后的底层结构是struct category_t,里面存储这分类的对象方法、类方法、属性、协议信息。
- 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)
- 加载处理过程
- 通过Runtime加载某个类的所有Category数据,
- 把所以Category的方法、属性、协议数据,合并到一个大数组中,后面参与编译的Category数据,会在数组的前面
2. Category和Class Extension的区别是什么?
- Class Extension在编译的时候,它的数据已经包含在类信息中,
- Category是在运行时,才会将数据整合并到类信息中
3. +load调用时间及调用顺序
- +load方法会在runtime加载类、分类时调用
- 每个类、分类的load,在程序运行过程中调用一次
- 调用顺序
- 先调用类的+load
按照编译先后顺序调用(先编译,先调用)
调用子类的+load之前会先调用父类的+load - 再调用分类的+load
按照编译先后顺序调用(先编译,先调用)
- 先调用类的+load
4. initialize方法
- +initialize方法会在类第一次收到消息时调用
- 调用顺序
- 先调用父类的+initialize,再调用子类的+initialize
(先初始化父类,再初始化子类,每个类只会初始化1次)
- 先调用父类的+initialize,再调用子类的+initialize
5.+initialize和+load的区别
+initialize和+load的很大区别是,+initialize是通过objc_msgSend进行调用的,所以有以下特点
- 如果子类没有实现+initialize,会调用父类的+initialize(所以父类的+initialize可能会被调用多次)
- 如果分类实现了+initialize,就覆盖类本身的+initialize调用
网友评论