load
- +load方法會(huì)在runtime加載類(lèi)、分類(lèi)時(shí)調(diào)用
- 每個(gè)類(lèi)、分類(lèi)的+load,在程序運(yùn)行過(guò)程中只調(diào)用一次
- 調(diào)用順序:
3.1 先調(diào)用類(lèi)的+load(按照編譯先后順序調(diào)用(先編譯,先調(diào)用),調(diào)用子類(lèi)的+load之前會(huì)先調(diào)用父類(lèi)的+load)
3.2 再調(diào)用分類(lèi)的+load(按照編譯先后順序調(diào)用(先編譯,先調(diào)用))
initialize
- initialize方法會(huì)在類(lèi)第一次接收到消息時(shí)調(diào)用
- 調(diào)用順序
2.1 先調(diào)用父類(lèi)的+initialize,再調(diào)用子類(lèi)的+initialize
2.2 先初始化父類(lèi),再初始化子類(lèi),每個(gè)類(lèi)只會(huì)初始化1次
load與initialize對(duì)比
| 條件 | +load | +initialize |
|---|---|---|
| 關(guān)鍵方法 | (*load_method)(cls, SEL_load) | objc_msgSend |
| 調(diào)用時(shí)機(jī) | 被添加到 runtime 時(shí) | 收到第一條消息前,可能永遠(yuǎn)不調(diào)用 |
| 調(diào)用順序 | 父類(lèi)->子類(lèi)->分類(lèi) | 父類(lèi)->子類(lèi) |
| 調(diào)用次數(shù) | 1次 | 多次 |
| 是否需要顯式調(diào)用父類(lèi)實(shí)現(xiàn) | 否 | 否 |
| 是否沿用父類(lèi)的實(shí)現(xiàn) | 否 | 是 |
| 分類(lèi)中的實(shí)現(xiàn) | 類(lèi)和分類(lèi)都執(zhí)行 | 覆蓋類(lèi)中的方法,只執(zhí)行分類(lèi)的實(shí)現(xiàn) |