+ (void)load;
+?(void)initialize;
load:load方法在這個文件被程序裝載時調用。只要是在Compile Sources中出現(xiàn)的文件總是會被裝載柬唯,這與這個類是否被用到無關锄奢,因此load方法總是在main函數(shù)之前調用。
int main(intargc,char* argv[]) {
@autoreleasepool{
NSLog(@"main");
returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));
}
+ (void)load{
NSLog(@"load");
}
+(void)initialize{
NSLog(@"initialize");
}
一。load特點:
1.當這個類被引用到程序中书在,就會執(zhí)行一次這個類的load方法且只有一次。對于加入運行期系統(tǒng)中的每個類(class)及分類(category)來說栏账,都會調用此方法栈源,且只會調用一次。如果分類和其所屬的類都調用了load方法茶鹃,則先調用類里面的闭翩,再調用分類里的迄埃。
2.如果一個類實現(xiàn)了load方法,在調用這個方法前會首先調用父類的load方法侄非。而且這個過程是自動完成的彩库,并不需要我們手動實現(xiàn)骇钦。如果類里沒有l(wèi)oad方法,不管其父類有沒有l(wèi)oad方法眯搭,都不會在執(zhí)行子類load方法時執(zhí)行父類的load方法。
用途:比如說你想要自定義導航欄仗岸,那么你就可以用load方法
+ (void)load
{
UINavigationBar*navBar = [UINavigationBarappearanceWhenContainedIn:self,nil];
//只要是通過模型設置,都是通過富文本設置
//設置導航條標題=> UINavigationBar
NSMutableDictionary*attrs = [NSMutableDictionarydictionary];
attrs[NSFontAttributeName] = [UIFontboldSystemFontOfSize:20];
[navBarsetTitleTextAttributes:attrs];
//設置導航條背景圖片
[navBarsetBackgroundImage:[UIImageimageNamed:@"navigationbarBackgroundWhite"]forBarMetrics:UIBarMetricsDefault];
[navBarsetTitleTextAttributes:[NSDictionarydictionaryWithObjectsAndKeys:[UIColorwhiteColor],NSForegroundColorAttributeName,nil]];
}
二扒怖。initialize方法特點:
1. initialize的自然調用是在第一次主動使用當前類的時候业稼。只會調用一次。
2. 和load不同俯邓,即使子類不實現(xiàn)initialize方法熔号,會把父類的實現(xiàn)繼承過來調用一遍。注意的是在此之前川慌,父類的方法已經被執(zhí)行過一次了梦重,同樣不需要super調用亮瓷。
父類:
+(void)initialize{
NSLog(@"initializeParent--%@",[selfclass]);
}
子類:沒有實現(xiàn)initalize方法
打印結果看出調用了兩次父類的方法嘱支。
第一次是創(chuàng)建的父類對象執(zhí)行了這個方法,因為在創(chuàng)建子類對象前要先創(chuàng)建父類對象沛膳,第二次是子類繼承父類的方法執(zhí)行這個方法锹安。所以正確的寫法是:
+(void)initialize{
if(self==[ViewControllerclass]){
NSLog(@"initializeParent--%@",[selfclass]);
}
}
相同點:
1.load和initialize方法內部使用了鎖,因此它們是線程安全的叹哭。實現(xiàn)時要盡可能保持簡單风罩,避免阻塞線程,不要再使用鎖超升。
2.在不考慮開發(fā)者主動使用的情況下,系統(tǒng)最多會調用一次云石。
3.都不需要super研乒。
不同點:
1.load方法通常用來進行Method Swizzle,initialize方法一般用于初始化全局變量或靜態(tài)變量宽菜。
2.調用時間不同铅乡。
3.load不遵守繼承規(guī)則烈菌,即子類如果沒有l(wèi)oad方法,那么在要執(zhí)行子類load方法時不會執(zhí)行父類load方法挚赊。
initialize遵守繼承的規(guī)則济瓢,即子類不管有沒有這個方法旺矾,都會執(zhí)行父類的這個方法。