load & initialize快速記憶


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():一般用于初始化該類的全局變量或靜態變量。
引用一張表加深一下印象。
![](http://upload-images.jianshu.io/upload_images/1661816-d558b83dd79054e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容