Category的底层结构
在编译完成程序运行之前会先生成一个叫category_t的结构体
![](https://img.haomeiwen.com/i1477016/756b4a7ff64c3ed4.png)
Category的加载处理过程
![](https://img.haomeiwen.com/i1477016/ba62b6121a9e4571.png)
多个Category时,后编译的在前面(编译顺序在Build->Phases->CompileSources里可以人为控制),最后才是本类的方法
+load方法
- +load方法会在runtime加载类、分类时调用:
也就是在程序启动的时候自动调用,而且很关键的一点是这里的调用方式并不是用Runtime消息机制,消息机制是主动调用方法时才会用到(如果是在程序里主动调用+load则是用的消息机制,这同时也说明消息机制只是调用方法的某一种策略,是最常用的一种策略但不是唯一),这里的调用是系统用load_method指针直接找到+load方法的IMP装载进内存,所以也很好理解只要某个类或者类别重写了+load方法,那么这个+load方法就会和其他的+load方法一起被调用,而不是像其他方法一样只会调用重写的那个方法(根本原因就是这里并不是用的消息机制)
- 调用顺序
-
先调用类的+load
- 按照编译先后顺序调用(先编译,先调用)
- 调用子类的+load之前会先调用父类的+load,如果父类的+load已经调用过了就不再调用
-
再调用分类的+load
- 按照编译先后顺序调用(先编译,先调用)
-
+initialize方法
- initialize方法会在类第一次接收到消息时调用
- 调用顺序
1. 先调用父类的+initialize,再调用子类的+initialize(先初始化父类,再初始化子类,每个类只会初始化1次)
load 和initialize的区别
![](https://img.haomeiwen.com/i1477016/1c25a1c96b35e6c9.png)
网友评论