Category中+load +initialize调用方法简单
2022-11-24 本文已影响0人
仰望远处
+load方法会在runtime加载类,分类的时候调用
每个类,分类的+load 在程序运行过程中只调用一次
调用顺序
- 1.先调用类的+load
- 按照编译先后顺序调用(先编译 先调用)
- 调用子类的+load之前先调用父类的+load
- 2.再调用分类的+load
1.按照编译先后顺序调用(先编译先调用)
+initialize的原理是通过消息转发机制实现,在类第一次接收到消息时调用.
调用顺序
1.先调用父类的+initialize 再调用子类的initialize
- objc_msgSend([TestPerson class],@selector(initialize));
- (先初始化父类 再初始化子类 每个类只会初始化1次)
+initialize 是通过objc_msgSend进行调用的有以下特点:
- 1.如果子类没有实现initialize 会调用父类的initialize(所以父类的+initialize可能会被调用多次)
- 2.如果分类实现了+initialize 就覆盖类本身的+initialize调用
两者区别
- 1.调用方式
1.)load是根据函数地址直接调用
2.)initialize是通过objc_msgSend调用
- 2. 调用时刻
1.)load是runtime加载类 分类的时候调用(只会调用1次)
2.)initialize是类第一次接收到消息的时候调用,每个类只会initialize一次(父类可能会被多次调用)
- 3.调用顺序
1.)load
1> 先调用类的load
a) 先编译的类,优先调用load
b) 调用子类得到load之前,会先调用父类的load
2> 再调用分类的load
a) 先编译的分类,优先调用load
2.)initialize
1>先初始化父类
2> 再初始化子类(可能最终调用的是父类的initialize方法)