Objective-C中有兩個方法比較特殊稚配,他們會在Runtime時根據(jù)情況自動調(diào)用,下面我們簡單分析一下調(diào)用時機(jī)以及使用場景~
一般在iOS初中級面試時偶爾會被問到load和initialize方法,我出了一道題号显,估計會搞暈很多人蛇数。大家來看一下下面的程序以及圖一會輸出什么?(這個Demo請點(diǎn)擊這里查看詳情)
//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;
}
答案是:
首先來說一下調(diào)用時機(jī):
- +load()方法:官方文檔上說
Invoked whenever a class or category is added to the Objective-C runtime;
批销,意思是說當(dāng)類被加載到runtime的時候就會運(yùn)行洒闸,也就是說是在main.m之前~會根據(jù)Compile Sources中的順序來加載,但還有一個需注意的加載順序 A class’s +load method is called after all of its superclasses’ +load methods.
-
A category +load method is called after the class’s own +load method.
意思是說有繼承關(guān)系的會先調(diào)用父類+load均芽,擴(kuò)展的類在所有的類在方法之后再開始擴(kuò)展方法的+load丘逸,每個類只會調(diào)用一次+load - +initialize()方法:官方文檔上說
Initializes the class before it receives its first message.
意思是在類接收第一條消息之前初始化類
值得注意的點(diǎn)是:類初始化的時候每個類只會調(diào)用一次+initialize(),如果子類沒有實(shí)現(xiàn)+initialize()掀宋,那么將會調(diào)用父類的+initialize()深纲,也就是意味著父類的+initialize()可能會被多次調(diào)用
最后說下使用場景:
- +load():通常用來進(jìn)行Method Swizzle仲锄,盡量避免過于復(fù)雜以及不必要的代碼
- +initialize():一般用于初始化全局變量或靜態(tài)變量
EOF:
好了,通過上述的所概括應(yīng)該能知道為什么答案是那樣了另外如果文章中有什么錯誤或者意見請大家多多指教