類編譯后,相關的數據結構會保留在目標文件中,在運行時得到解析和使用(類的加載和初始化)。在運行期提前并且自動調用這兩個方法,我們可以利用他們在類被使用前,做一些預處理工作。
initialize
在類接收第一個消息之前調用,運行環境基本健全,運行過程中是線程安全的.
父類接受這個消息在它的子類之前.
父類initialize會被調用多次:如果子類沒有實現initialize,runtime會調用從父類繼承的initialize;或者子類調用[super initialize]。
避免被多次調用如下:
+ (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}
load
在類或類目被加載的時候調用
類的load調用在父類load后
類目的load調用在類本身load后
load 和 initialize 的區別
- 在不考慮開發者主動使用的情況下,系統最多會調用一次
- 如果父類和子類都被調用,父類的調用一定在子類之前
- 都是為了應用運行提前創建合適的運行環境
- 在使用時都不要過重地依賴于這兩個方法,除非真正必要
load:只要類所在文件被引用就會被調用,
initialize:在類或者其子類的第一個方法被調用前調用。
所以如果類沒有被引用進項目,就不會有load調用;但即使類文件被引用進來,但是沒有使用,那么initialize也不會被調用。