+load方法:
- +load方法是通過(guò)函數(shù)指針地址來(lái)調(diào)用的。
- +load方法會(huì)在runtime加載類、分類時(shí)調(diào)用,在程序運(yùn)行過(guò)程中只調(diào)用一次。
- 調(diào)用順序:
1. 先調(diào)用類的+load方法。
按照編譯先后的順序調(diào)用。(先編譯,先調(diào)用)
調(diào)用子類的+load之前會(huì)先調(diào)用父類的+load方法。
2. 再調(diào)用分類的+load方法。
所有的分類都是按照編譯先后的順序調(diào)用。(先編譯,先調(diào)用)
+initialize方法:
- +initialize方法是通過(guò)objc_msgSend(消息發(fā)送機(jī)制)來(lái)調(diào)用。
- +initialize方法是會(huì)在類第一次接收到消息時(shí)調(diào)用,在程序運(yùn)行過(guò)程中只調(diào)用一次,如果沒(méi)有接受到消息,則該方法就不會(huì)被調(diào)用。
- 調(diào)用順序:
如果分類中實(shí)現(xiàn)了+initialize方法,就直接調(diào)用分類的+initialize方法。
如果分類中沒(méi)有實(shí)現(xiàn)+initialize方法,先調(diào)用父類的+initialize方法,再調(diào)用子類的+initialize方法。(先初始化父類,再初始化子類,每個(gè)類只會(huì)初始化一次)
如果子類中沒(méi)有實(shí)現(xiàn)+initialize方法,會(huì)直接調(diào)用父類的+initialize方法。(所以父類的+initialize方法可能會(huì)被調(diào)用多次)。
+load方法和+initialize的區(qū)別:
調(diào)用方式:
- +load方法:
是通過(guò)函數(shù)指針地址來(lái)調(diào)用的。 - initialize方法:
是通過(guò)objc_msgSend(消息發(fā)送機(jī)制)來(lái)調(diào)用。
調(diào)用時(shí)刻:
- +load方法:
是在runtime加載類、分類時(shí)調(diào)用,在程序運(yùn)行過(guò)程中只調(diào)用一次。 - +initialize方法:
是在類第一次收到消息時(shí)調(diào)用,在程序運(yùn)行過(guò)程中,如果該類沒(méi)有收到消息,那么+initialize方法也不會(huì)被調(diào)用。如果子類中沒(méi)有實(shí)現(xiàn)+initialize方法,會(huì)直接調(diào)用父類的+initialize方法。所以父類的+initialize方法可能會(huì)被調(diào)用多次,子類中的+initialize方法只調(diào)用一次。
調(diào)用順序:
- +load方法:
1. 先調(diào)用類的+load方法。先編譯的類,優(yōu)先調(diào)用+load方法;調(diào)用子類的+load方法之前,會(huì)先調(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方法有可能會(huì)被多次調(diào)用)