runtime调用load方的的底层实现
有代码可知,在程序运行中,会先调用类的load方法,再调用分类的load方法
调用load的具体方法如下
image.png
由截图可知:load方法是取出后,直接进行调用的,并不是通过消息转发机制massage_send进行调用的,而且当调用子类的load方法时,会先调用父类的load方法,再调用子类的load方法。
总结
- +load方法会在runtime加载类,分类的时候进行调用。
- 每个类,分类的+load方法在程序的运行过程中只会调用一次;
1,先调用类的+load方法
1.1按照编译先后顺序进行调用(先编译,先调用);
1.2调用子类的load方法之前会先调用父类的load方法;
2,再调用分类的+load( 按照编译的先后顺序进行调用);
+initialize方法会在类第一次接收到消息的时候进行调用,调用顺序为:
先调用父类的+initialize,再调用子类的+initialize(先初始化父类,再初始化子类,而且每个类只会初始化一次)
+initialize和+load的区别:
1.调用方式不同:
- initialize是通过消息转发机制massage_send进行调用的,所以有如下t特点:如果子类没有实现+initialize方法,会调用父类的+initialize方法(所以父类的+initialize方法),如果分类实现了+initialize方法,会覆盖类本身的+initialize方法;
+load方法是先查找到函数地址后直接进行调用的;
2.调用时刻不同:- load是runtime加载类/分类的时候进行调用(只会调用一次);
- initialize是类第一次接收到消息的时候进行调用,每一个类只会initialize一次(父类的可能会被调用多次)。
3,调用顺序:
- load方法是先调用类的load,在调用分类的load(先编译的类优先调用,调用子类的load方法之前,会先调用父类的load);
-initialize是先初始化父类,再初始化子类(子类没有实现方法时,会调用父类的initialize)。
网友评论