+(void)initialize
+(void)load
Apple的文檔很清楚地說明了initialize和load的區(qū)別在于:load是只要類所在文件被引用就會被調(diào)用执虹,而initialize是在類或者其子類的第一個方法被調(diào)用前調(diào)用。所以如果類沒有被引用進(jìn)項目侥啤,就不會有l(wèi)oad調(diào)用;但即使類文件被引用進(jìn)來蚁鳖,但是沒有使用赁炎,那么initialize也不會被調(diào)用。
它們的相同點(diǎn)在于:方法只會被調(diào)用一次琅攘。(其實(shí)這是相對runtime來說的坞琴,后邊會做進(jìn)一步解釋)逗抑。
文檔也明確闡述了方法調(diào)用的順序:父類(Superclass)的方法優(yōu)先于子類(Subclass)的方法邮府,類中的方法優(yōu)先于類別(Category)中的方法。
//Father.m
+ (void)load {
NSLog(@"Father:%s %@", __FUNCTION__, [self class]);
}
+ (void)initialize {
NSLog(@"Father:%s %@", __FUNCTION__, [self class]);
}
//Son.m Class Son Extends Father
+ (void)load {
NSLog(@"Son:%s %@", __FUNCTION__, [self class]);
}
//Son+load.m
+ (void)load {
NSLog(@"Son+load:%s %@", __FUNCTION__, [self class]);
}
//Other.m
+ (void)load {
NSLog(@"Other:%s %@", __FUNCTION__, [self class]);
}
+ (void)initialize {
NSLog(@"Other:%s %@", __FUNCTION__, [self class]);
}
//Other+initialize.m
+ (void)initialize {
NSLog(@"Other+initialize:%s %@", __FUNCTION__, [self class]);
}
//main.m
int main(int argc, char * argv[]) {
NSLog(@"Main method start!");
return 0;
}
QQ20170303-105117@2x.png
RUN出來的結(jié)果如下:
2017-03-03 10:35:15.979 Load+Initialize[3271:684594] Other+initialize:+[Other(initialize) initialize] Other
2017-03-03 10:35:16.017 Load+Initialize[3271:684594] Other:+[Other load] Other
2017-03-03 10:35:16.018 Load+Initialize[3271:684594] Father:+[Father initialize] Father
2017-03-03 10:35:16.018 Load+Initialize[3271:684594] Father:+[Father load] Father
2017-03-03 10:35:16.018 Load+Initialize[3271:684594] Father:+[Father initialize] Son
2017-03-03 10:35:16.018 Load+Initialize[3271:684594] Son:+[Son load] Son
2017-03-03 10:35:16.018 Load+Initialize[3271:684594] Son+load:+[Son(load) load] Son
2017-03-03 10:35:16.019 Load+Initialize[3271:684594] Main method start!
當(dāng)類被加載到runtime的時候就會運(yùn)行仙辟,也就是說是在main.m之前~會根據(jù)Compile Sources中的順序來加載。
需要注意的是加載son+load的順序
- son的父類是father未檩,所以先加載[Father initialize]和[Father load]冤狡。
- 執(zhí)行 son的initialize,但是son內(nèi)沒有實(shí)現(xiàn)這個方法悲雳,所以執(zhí)行父類的initialize怜奖,但是結(jié)果為son
- 執(zhí)行son+load的load方法
//輸出當(dāng)前方法名
__FUNCTION__ 是C++編譯器的標(biāo)識符
__LINE__ 執(zhí)行代碼的行數(shù)
參考博客:
Objective-C中l(wèi)oad和initialize有點(diǎn)難的一道題
NSObject