共同點:
在不考慮開發者主動使用的情況下,系統最多會調用一次
如果父類和子類都被調用,父類的調用一定在子類之前
都是為了應用運行提前創建合適的運行環境(例如下面的懶加載字典)
在使用時都不要過重地依賴于這兩個方法,除非真正必要
區別:
一、load 類方法
調用時機比較早,運行環境有不確定因素。具體說來,在iOS上通常就是App啟動時進行加載,但當load調用的時候,并不能保證所有類都加載完成且可用,必要時還要自己負責做auto release處理。對于有依賴關系的兩個庫中,被依賴的類的load會優先調用。但在一個庫之內,調用順序是不確定的。
對于一個類而言,沒有load方法實現就不會調用,不會考慮對NSObject的繼承。一個類的load方法不用寫明[super load],父類就會收到調用,并且在子類之前。Category的load也會收到調用,但順序上在主類的load調用之后,不會直接觸發initialize的調用。
二、initialize 類方法(推薦使用)
initialize的自然調用是在 第一次主動使用 當前類 的時候。
在initialize方法收到調用時,運行環境基本健全。
initialize的運行過程中是能保證線程安全的。
和load不同,即使子類不實現initialize方法,會把父類的實現繼承過來調用一遍。注意的是在此之前,父類的方法已經被執行過一次了,同樣不需要super調用。
由于initialize的這些特點,使得其應用比load要略微廣泛一些。可用來做一些初始化工作,或者單例模式的一種實現方案。
執行代碼順序
程序啟動 -> load(自動調用) -> [MLAudioTool loadData] ->initialize(自動調用) ->loadData
代碼演示
LLAudioTool.h
/** 靜態可變字典全局變量 */
static NSMutableDictionary *_allDataDict;
@implementation MLAudioTool
/** 程序剛啟動就會調用這個方法 */
+(void)load{
NSLog(@"--load---");
}
/** 當在外面的控制器里執行 [MLAudioTool loadData]; 會立馬執行initialize方法 */
+(void)initialize{
NSLog(@"--initialize---");
_allDataDict = [NSMutableDictionary dictionary]; //初始化載字典
}
//加載數據
+(void)loadData{
_allDataDict[@"key"] = @"lyz";
/** 如果不執行initialize方法初始化字典的話,打印為null的*/
NSLog(@"%@",_allDataDict[@"key"]);
}
@end