runtime調(diào)用load方的的底層實現(xiàn)

image.png
有代碼可知,在程序運行中,會先調(diào)用類的load方法,再調(diào)用分類的load方法
調(diào)用load的具體方法如下

image.png
由截圖可知:load方法是取出后,直接進行調(diào)用的,并不是通過消息轉(zhuǎn)發(fā)機制massage_send進行調(diào)用的,而且當(dāng)調(diào)用子類的load方法時,會先調(diào)用父類的load方法,再調(diào)用子類的load方法。
總結(jié)
- +load方法會在runtime加載類,分類的時候進行調(diào)用。
- 每個類,分類的+load方法在程序的運行過程中只會調(diào)用一次;
1,先調(diào)用類的+load方法
1.1按照編譯先后順序進行調(diào)用(先編譯,先調(diào)用);
1.2調(diào)用子類的load方法之前會先調(diào)用父類的load方法;
2,再調(diào)用分類的+load( 按照編譯的先后順序進行調(diào)用);
+initialize方法會在類第一次接收到消息的時候進行調(diào)用,調(diào)用順序為:
先調(diào)用父類的+initialize,再調(diào)用子類的+initialize(先初始化父類,再初始化子類,而且每個類只會初始化一次)
+initialize和+load的區(qū)別:
1.調(diào)用方式不同:
- initialize是通過消息轉(zhuǎn)發(fā)機制massage_send進行調(diào)用的,所以有如下t特點:如果子類沒有實現(xiàn)+initialize方法,會調(diào)用父類的+initialize方法(所以父類的+initialize方法),如果分類實現(xiàn)了+initialize方法,會覆蓋類本身的+initialize方法;
+load方法是先查找到函數(shù)地址后直接進行調(diào)用的;
2.調(diào)用時刻不同:- load是runtime加載類/分類的時候進行調(diào)用(只會調(diào)用一次);
- initialize是類第一次接收到消息的時候進行調(diào)用,每一個類只會initialize一次(父類的可能會被調(diào)用多次)。
3,調(diào)用順序:
- load方法是先調(diào)用類的load,在調(diào)用分類的load(先編譯的類優(yōu)先調(diào)用,調(diào)用子類的load方法之前,會先調(diào)用父類的load);
-initialize是先初始化父類,再初始化子類(子類沒有實現(xiàn)方法時,會調(diào)用父類的initialize)。