+load方法會(huì)在runtime加載類,分類的時(shí)候調(diào)用
每個(gè)類,分類的+load 在程序運(yùn)行過程中只調(diào)用一次
調(diào)用順序
- 1.先調(diào)用類的+load
- 按照編譯先后順序調(diào)用(先編譯 先調(diào)用)
- 調(diào)用子類的+load之前先調(diào)用父類的+load
- 2.再調(diào)用分類的+load
1.按照編譯先后順序調(diào)用(先編譯先調(diào)用)
+initialize的原理是通過消息轉(zhuǎn)發(fā)機(jī)制實(shí)現(xiàn),在類第一次接收到消息時(shí)調(diào)用.
調(diào)用順序
1.先調(diào)用父類的+initialize 再調(diào)用子類的initialize
- objc_msgSend([TestPerson class],@selector(initialize));
- (先初始化父類 再初始化子類 每個(gè)類只會(huì)初始化1次)
+initialize 是通過objc_msgSend進(jìn)行調(diào)用的有以下特點(diǎn):
- 1.如果子類沒有實(shí)現(xiàn)initialize 會(huì)調(diào)用父類的initialize(所以父類的+initialize可能會(huì)被調(diào)用多次)
- 2.如果分類實(shí)現(xiàn)了+initialize 就覆蓋類本身的+initialize調(diào)用
兩者區(qū)別
- 1.調(diào)用方式
1.)load是根據(jù)函數(shù)地址直接調(diào)用
2.)initialize是通過objc_msgSend調(diào)用
- 2. 調(diào)用時(shí)刻
1.)load是runtime加載類 分類的時(shí)候調(diào)用(只會(huì)調(diào)用1次)
2.)initialize是類第一次接收到消息的時(shí)候調(diào)用,每個(gè)類只會(huì)initialize一次(父類可能會(huì)被多次調(diào)用)
- 3.調(diào)用順序
1.)load
1> 先調(diào)用類的load
a) 先編譯的類,優(yōu)先調(diào)用load
b) 調(diào)用子類得到load之前,會(huì)先調(diào)用父類的load
2> 再調(diào)用分類的load
a) 先編譯的分類,優(yōu)先調(diào)用load
2.)initialize
1>先初始化父類
2> 再初始化子類(可能最終調(diào)用的是父類的initialize方法)