Write In Frist:
Q:為什么NSObject的類別的load方法,最后一個調用。
A:我走入了一個誤區,父類優先于子類調用load方法。類優先于類別調用load方法。但是類別的load方法并沒有依賴于繼承關系。它其實是在buildPhases-->Compile Sources顯式控制的。你可以隨意挪動文件順序實際開發不建議這么操作
。但最后輸出的還是父類-子類-類別順序。
+ (void)load
Invoked whenever a class or category is added to the Objective-C runtime; implement this method to perform class-specific behavior upon loading.
官方說法:每當將類或類別添加到Objective-C運行時時調用;實現此方法在加載時執行類特定的行為。
即:該方法在類第一次被加載時調用。只執行一次。
使用注意事項:
- A class’s +load method is called after all of its superclasses’ +load methods.
- A category +load method is called after the class’s own +load method.
啥意思嘞:父類的 +load 方法先于子類的 +load 方法調用,類本身的 +load 方法調用先于類別的 +load 方法調用。但是類別并不依賴繼承關系。buildPhases-->Compile Sources會顯示調用順序。這塊兒其實也是有含義的。研究完貼鏈接。
load(父類)->load(兒子類)->load(孫子類)->load(xx類別)->load(xx類別)->load(xx類別)
- 該方法執行實在main函數前面,所以你懂的......我們的黑魔法Method Swizzling都在這里面實現的哦
+ (void)initialize
Initializes the class before it receives its first message.
官方說法:在收到第一條消息之前初始化該類。
即:該類收到第一條消息時調用。不要挑字眼,+(void)load不算
如果子類或者類別沒有實現該方法,那么會調用到父類的initialize哦。
Special Considerations
1、該方法是線程安全的。
2、該方法初始化每個類時只調用一次,但是但是但是 如果子類沒有實現該方法,或者子類調用super方法時,也會調用到父類的實現。
- 蘋果爸爸講了,你不能依賴initialize做復雜的初始化,簡單點兒用
you should not rely on initialize for complex initialization, and should instead limit it to straightforward, class local initialization.
- 當然蘋果爸爸也給了我們一個保護方法。
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}```
這樣就只有當前類調用了。
###最后說下使用場景:
+load():最常見的就是Method Swizzling了。
+initialize():一般用于初始化該類的全局變量或靜態變量。
引用一張表加深一下印象。
