在c语言中load,一道题理清Objective-C中的load和initialize
Objective-C中有兩個(gè)方法比較特殊,他們會(huì)在Runtime時(shí)根據(jù)情況自動(dòng)調(diào)用,下面我們簡(jiǎn)單分析一下調(diào)用時(shí)機(jī)以及使用場(chǎng)景~
一般在iOS初中級(jí)面試時(shí)偶爾會(huì)被問到load和initialize方法,我出了一道題,估計(jì)會(huì)搞暈很多人。大家來看一下下面的程序以及圖一會(huì)輸出什么?(這個(gè)Demo請(qǐng)點(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)用時(shí)機(jī):+load()方法:官方文檔上說Invoked whenever a class or category is added to the Objective-C runtime;,意思是說當(dāng)類被加載到runtime的時(shí)候就會(huì)運(yùn)行,也就是說是在main.m之前~會(huì)根據(jù)Compile Sources中的順序來加載,但還有一個(gè)需注意的加載順序
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)系的會(huì)先調(diào)用父類+load,擴(kuò)展的類在所有的類在方法之后再開始擴(kuò)展方法的+load,每個(gè)類只會(huì)調(diào)用一次+load+initialize()方法:官方文檔上說Initializes the class before it receives its first message.意思是在類接收第一條消息之前初始化類
值得注意的點(diǎn)是:類初始化的時(shí)候每個(gè)類只會(huì)調(diào)用一次+initialize(),如果子類沒有實(shí)現(xiàn)+initialize(),那么將會(huì)調(diào)用父類的+initialize(),也就是意味著父類的+initialize()可能會(huì)被多次調(diào)用
最后說下使用場(chǎng)景:+load():通常用來進(jìn)行Method Swizzle,盡量避免過于復(fù)雜以及不必要的代碼
+initialize():一般用于初始化全局變量或靜態(tài)變量
EOF:
好了,通過上述的所概括應(yīng)該能知道為什么答案是那樣了~另外如果文章中有什么錯(cuò)誤或者意見請(qǐng)大家多多指教~
總結(jié)
以上是生活随笔為你收集整理的在c语言中load,一道题理清Objective-C中的load和initialize的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言如何创建虚拟串口,模拟串口的C语言
- 下一篇: 电热水器工作过程 c语言,热水器工作流程