load
1、分类中也是有load方法的
2、load方法是runtime加载类、分类的时候系统自动调用的
3、为什么子类有load子类、分类中有load方法不会覆盖父类的load方法
因为+(void)load方法是系统自动调用的,而不是通过 [NSobject load]调用的,[NSobject load] 这样调用的本质就是消息发送,通过消息发送的方式寻找方法都是通过isa找到对应的类对象,然后在类对象或者元类对象中遍历方法寻找,但是分类的方法在原来类对象的前面,所以会覆盖,但是系统自动调用的load方法不是走的消息发送机制,而是通过各自(类或者分类,子类)的元类对象找到对应的load方法的指针地址,然后再来调用
4、分类的加载顺序
按照编译顺序加载类的load方法 但是在加载子类的load方法之前,会先加载父类的load方法,加载完类的load方法之后,就会调用分类的load方法,分类的load方法就是按照编译顺序加载了
initialize
+initialize 是在类第一次接收到消息的时候调用一次,而且是先调用父类的+initialize 再调用子类的+initialize
+ initialize 和 + load 的区别
+initialize 是通过objc_msgSend 方法调用的,那么他就跟普通方法一样,通过isa指针找元类对象的 +initialize 如果没找到就会去父类中找+initialize ,所以父类的+initialize方法是有可能会调用多次的
如果分类实现了+initialize方法,那是会覆盖类本身的+initialize的。
网友评论