日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在c语言中load,一道题理清Objective-C中的load和initialize

發(fā)布時(shí)間:2023/12/6 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在c语言中load,一道题理清Objective-C中的load和initialize 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。