+load方法
- load方法会在runtime加载类、分类时调用 ( 常在这里做 方法交换 Method Swizzling)
- 每个类、分类在程序运行过程中只调用 一次load方法
- 调用顺序
1.先调用类的+load
按照编译顺序调用,先编译先调用
调用子类的+load之前会先调用父类的+load
2.再调用分类的+load
按照编译顺序调用,先编译先调用 - load方法是根据方法地址(*load_method)(cls, SEL_load)
直接调用的,并不是经过objc_msgSend函数调用
+initialize方法
- +initialize方法会在类第一次接收到消息时调用
- 调用顺序
先调用父类的+initialize,再调用子类的+initialize
(相处初始化父类,再初始化子类,每个类只会初始化一次)
+initialize和+load的区别
+initialize是通过objc_msgSend调用的,所以有以下特点:如果子类没有实现+initialize,会调用父类的+initialize(所以父类的+intialize方法可以会被调用多次),如果分类实现的+initialize,就会覆盖类的+initialize调用。而+load是通过方法地址直接调用的,所以不会有这些特点。
网友评论