+load方法 與+initialize方法的比較

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)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容