laod和initialize
+load
+load方法會(huì)在runtime加載類卸察、分類時(shí)調(diào)用既忆,每個(gè)類、分類的+load邑雅,在程序運(yùn)行過程中只調(diào)用一次片橡,+load方法是根據(jù)方法地址直接調(diào)用,并不是經(jīng)過objc_msgSend函數(shù)調(diào)用淮野。
調(diào)用順序
- 先調(diào)用子類的+load捧书,按照編譯先后順序調(diào)用(先編譯,先調(diào)用)骤星,調(diào)用子類的+load之前會(huì)先調(diào)用父類的+load
- 再調(diào)用分類的+load经瓷,按照編譯先后順序調(diào)用(先編譯,先調(diào)用)
+initialize
+initialize方法會(huì)在類第一次接收到消息時(shí)調(diào)用
調(diào)用順序
先調(diào)用父類的+initialize洞难,再調(diào)用子類的+initialize(先初始化父類舆吮,再初始化子類,每個(gè)類只會(huì)初始化1次)
load队贱、initialize方法的區(qū)別什么色冀?它們?cè)赾ategory中的調(diào)用的順序?以及出現(xiàn)繼承時(shí)他們之間的調(diào)用過程柱嫌?
+initialize和+load的最大區(qū)別是锋恬,+initialize是通過objc_msgSend進(jìn)行調(diào)用的,所以有以下特點(diǎn)
- 如果子類沒有實(shí)現(xiàn)+initialize编丘,會(huì)調(diào)用父類的+initialize(所以父類的+initialize可能會(huì)被調(diào)用多次)
- 如果分類實(shí)現(xiàn)了+initialize与学,就覆蓋類本身的+initialize調(diào)用
- load是根據(jù)函數(shù)地址直接調(diào)用彤悔,initialize是通過objc_msgSend調(diào)用
- load是runtime加載類、分類的時(shí)候調(diào)用(只會(huì)調(diào)用1次)索守,initialize是類第一次接收到消息的時(shí)候調(diào)用晕窑,每一個(gè)類只會(huì)initialize一次(父類的initialize方法可能會(huì)被調(diào)用多次)
- load先調(diào)用類的load,先編譯的類卵佛,優(yōu)先調(diào)用load幕屹,調(diào)用子類的load之前,會(huì)先調(diào)用父類的load级遭,再調(diào)用分類的load,先編譯的分類渺尘,優(yōu)先調(diào)用load挫鸽。initialize先初始化父類,再初始化子類(可能最終調(diào)用的是父類的initialize方法)