+load 和 +initialize的区别
2021-10-14 本文已影响0人
SunnyWendy
+load方法
① +load方法时通过地址直接访问的
② +load方法会在加载类、分类时调用。只要类被添加到runtime中,就会调用+load方法。
③ 每个类、分类的+load方法,在运行过程中只调用一次
调用顺序
① 先调用类的+load 方法 ,再调用分类的+load方法
②按照编译顺序,先编译先调用,调用子类的+load之前会先调用父类的+load
注意
我看见有的文章说“因为调用子类的+load方法之前会调用父类的+load,所以父类的+load方法会调用多次”,这种说法是错误的,每个类的+load的方法只会调用一次,如果之前父类的+load方法已经被调用,那么子类将不会再调用父类的+load。
例如SuperClass有两个子类SubClass1和SubClass2,编译顺序为SubClass1、SubClass2、SuperClass,那么+load方法的调用顺序为:SuperClass,SubClass1,SubClass2。
+ initialize
① +initialize方法时通过msg_send函数调用的
② 只有当类第一次被发送消息时才会执行,不一定会执行。
调用顺序
①因为是通过msg_send进行调用,所以会方法覆盖,覆盖顺序为分类-> 子类 -> 父类。只有一个+initialize会被执行
②如果子类没有实现+initialize,会调用父类的+initialize。所以父类的+initialize可能会被调用多次。
③如果有多个分类实现了+initialize,会调用最后加载的分类的+initialize。