+load方法:
- +load方法是通過函數(shù)指針地址來調(diào)用的静浴。
- +load方法會在runtime加載類窟哺、分類時調(diào)用,在程序運行過程中只調(diào)用一次牡拇。
- 調(diào)用順序:
1. 先調(diào)用類的+load方法骡送。
按照編譯先后的順序調(diào)用蔓肯。(先編譯稚失,先調(diào)用)
調(diào)用子類的+load之前會先調(diào)用父類的+load方法搀绣。
2. 再調(diào)用分類的+load方法飞袋。
所有的分類都是按照編譯先后的順序調(diào)用。(先編譯链患,先調(diào)用)
+initialize方法:
- +initialize方法是通過objc_msgSend(消息發(fā)送機制)來調(diào)用巧鸭。
- +initialize方法是會在類第一次接收到消息時調(diào)用,在程序運行過程中只調(diào)用一次锣险,如果沒有接受到消息蹄皱,則該方法就不會被調(diào)用览闰。
- 調(diào)用順序:
如果分類中實現(xiàn)了+initialize方法芯肤,就直接調(diào)用分類的+initialize方法。
如果分類中沒有實現(xiàn)+initialize方法压鉴,先調(diào)用父類的+initialize方法崖咨,再調(diào)用子類的+initialize方法。(先初始化父類油吭,再初始化子類击蹲,每個類只會初始化一次)
如果子類中沒有實現(xiàn)+initialize方法署拟,會直接調(diào)用父類的+initialize方法。(所以父類的+initialize方法可能會被調(diào)用多次)歌豺。
+load方法和+initialize的區(qū)別:
調(diào)用方式:
- +load方法:
是通過函數(shù)指針地址來調(diào)用的推穷。 - initialize方法:
是通過objc_msgSend(消息發(fā)送機制)來調(diào)用。
調(diào)用時刻:
- +load方法:
是在runtime加載類类咧、分類時調(diào)用馒铃,在程序運行過程中只調(diào)用一次。 - +initialize方法:
是在類第一次收到消息時調(diào)用痕惋,在程序運行過程中区宇,如果該類沒有收到消息,那么+initialize方法也不會被調(diào)用值戳。如果子類中沒有實現(xiàn)+initialize方法议谷,會直接調(diào)用父類的+initialize方法。所以父類的+initialize方法可能會被調(diào)用多次堕虹,子類中的+initialize方法只調(diào)用一次卧晓。
調(diào)用順序:
- +load方法:
1. 先調(diào)用類的+load方法。先編譯的類赴捞,優(yōu)先調(diào)用+load方法禀崖;調(diào)用子類的+load方法之前,會先調(diào)用父類的+load方法螟炫。
2. 再調(diào)用分類的+load方法波附。先編譯的分類,優(yōu)先調(diào)用+load方法昼钻。 - +initialize方法:
如果存在分類掸屡,直接調(diào)用分類的+initialize方法。
如果不存在分類然评,則優(yōu)先調(diào)用父類的+initialize方法仅财,再調(diào)用子類的+initialize方法。(父類中的+initialize方法有可能會被多次調(diào)用)