+load方法:
- +load方法是通过函数指针地址来调用的。
- +load方法会在runtime加载类、分类时调用,在程序运行过程中只调用一次。
- 调用顺序:
1. 先调用类的+load方法。
按照编译先后的顺序调用。(先编译,先调用)
调用子类的+load之前会先调用父类的+load方法。
2. 再调用分类的+load方法。
所有的分类都是按照编译先后的顺序调用。(先编译,先调用)
+initialize方法:
- +initialize方法是通过objc_msgSend(消息发送机制)来调用。
- +initialize方法是会在类第一次接收到消息时调用,在程序运行过程中只调用一次,如果没有接受到消息,则该方法就不会被调用。
- 调用顺序:
如果分类中实现了+initialize方法,就直接调用分类的+initialize方法。
如果分类中没有实现+initialize方法,先调用父类的+initialize方法,再调用子类的+initialize方法。(先初始化父类,再初始化子类,每个类只会初始化一次)
如果子类中没有实现+initialize方法,会直接调用父类的+initialize方法。(所以父类的+initialize方法可能会被调用多次)。
+load方法和+initialize的区别:
调用方式:
- +load方法:
是通过函数指针地址来调用的。 - initialize方法:
是通过objc_msgSend(消息发送机制)来调用。
调用时刻:
- +load方法:
是在runtime加载类、分类时调用,在程序运行过程中只调用一次。 - +initialize方法:
是在类第一次收到消息时调用,在程序运行过程中,如果该类没有收到消息,那么+initialize方法也不会被调用。如果子类中没有实现+initialize方法,会直接调用父类的+initialize方法。所以父类的+initialize方法可能会被调用多次,子类中的+initialize方法只调用一次。
调用顺序:
- +load方法:
1. 先调用类的+load方法。先编译的类,优先调用+load方法;调用子类的+load方法之前,会先调用父类的+load方法。
2. 再调用分类的+load方法。先编译的分类,优先调用+load方法。 - +initialize方法:
如果存在分类,直接调用分类的+initialize方法。
如果不存在分类,则优先调用父类的+initialize方法,再调用子类的+initialize方法。(父类中的+initialize方法有可能会被多次调用)