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