+(void)load司致;
當類對象被引入項目時, runtime 會向每一個類對象發(fā)送 load 消息. load 方法還是非常的神奇的, 因為它會在每一個類甚至分類被引入時僅調(diào)用一次, 調(diào)用的順序是父類優(yōu)先于子類, 子類優(yōu)先于分類. 而且 load 方法不會被類自動繼承, 每一個類中的 load 方法都不需要像 viewDidLoad 方法一樣調(diào)用父類的方法. 由于 load 方法會在類被 import 時調(diào)用一次, 而這時往往是改變類的行為的最佳時機. 我在 DKNightVersion 中使用 method swizlling 來修改原有的方法時, 就是在分類 load 中實現(xiàn)的.
+(void)initialize;
initialize 方法和 load 方法有一些不同, 它雖然也會在整個 runtime 過程中調(diào)用一次, 但是它是在該類的第一個方法執(zhí)行之前調(diào)用, 也就是說 initialize 的調(diào)用是惰性的, 它的實現(xiàn)也與我們在平時使用的惰性初始化屬性時基本相同. 我在實際的項目中并沒有遇到過必須使用這個方法的情況, 在該方法中主要做靜態(tài)變量的設(shè)置并用于確保在實例初始化前某些條件必須滿足.
總結(jié):
- 執(zhí)行時機
+(void)load在程序運行后立即執(zhí)行
+(void)initialize在類的方法第一次被調(diào)時執(zhí)行
- 若自身未定義聋迎,是否沿用父類的方法脂矫?
+(void)load 否
+(void)initialize是
- 類別中的定義
+(void)load全都執(zhí)行,但后于類中的方法 覆蓋類中的方法
+(void)initialize 只執(zhí)行一個