+ (void)load;
+?(void)initialize;
load:load方法在這個文件被程序裝載時調用。只要是在Compile Sources中出現的文件總是會被裝載,這與這個類是否被用到無關,因此load方法總是在main函數之前調用。
int main(intargc,char* argv[]) {
@autoreleasepool{
NSLog(@"main");
returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));
}
+ (void)load{
NSLog(@"load");
}
+(void)initialize{
NSLog(@"initialize");
}
一。load特點:
1.當這個類被引用到程序中,就會執行一次這個類的load方法且只有一次。對于加入運行期系統中的每個類(class)及分類(category)來說,都會調用此方法,且只會調用一次。如果分類和其所屬的類都調用了load方法,則先調用類里面的,再調用分類里的。
2.如果一個類實現了load方法,在調用這個方法前會首先調用父類的load方法。而且這個過程是自動完成的,并不需要我們手動實現。如果類里沒有load方法,不管其父類有沒有load方法,都不會在執行子類load方法時執行父類的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不同,即使子類不實現initialize方法,會把父類的實現繼承過來調用一遍。注意的是在此之前,父類的方法已經被執行過一次了,同樣不需要super調用。
父類:
+(void)initialize{
NSLog(@"initializeParent--%@",[selfclass]);
}
子類:沒有實現initalize方法
打印結果看出調用了兩次父類的方法。
第一次是創建的父類對象執行了這個方法,因為在創建子類對象前要先創建父類對象,第二次是子類繼承父類的方法執行這個方法。所以正確的寫法是:
+(void)initialize{
if(self==[ViewControllerclass]){
NSLog(@"initializeParent--%@",[selfclass]);
}
}
相同點:
1.load和initialize方法內部使用了鎖,因此它們是線程安全的。實現時要盡可能保持簡單,避免阻塞線程,不要再使用鎖。
2.在不考慮開發者主動使用的情況下,系統最多會調用一次。
3.都不需要super。
不同點:
1.load方法通常用來進行Method Swizzle,initialize方法一般用于初始化全局變量或靜態變量。
2.調用時間不同。
3.load不遵守繼承規則,即子類如果沒有load方法,那么在要執行子類load方法時不會執行父類load方法。
initialize遵守繼承的規則,即子類不管有沒有這個方法,都會執行父類的這個方法。