當(dāng)前位置:
首頁 >
浅思OC的语言特性
發(fā)布時間:2025/4/5
26
豆豆
算了算,學(xué)習(xí)IOS已經(jīng)有一段時間了。今天花了點(diǎn)時間思考一下OC的語言特性,讓自己的心不要那么浮躁,注重基礎(chǔ),回歸本源。OC做為一門面向?qū)ο笳Z言,自然具有面向?qū)ο蟮恼Z言特性,如封裝、繼承、多態(tài)。他具有靜態(tài)語言的特性(如C++),又有動態(tài)語言的效率(動態(tài)綁定、動態(tài)加載等)。整體來說,確實(shí)是一門不錯的編程語言。現(xiàn)在,讓我來想想OC的動態(tài)語言特性。OC的動態(tài)特性表現(xiàn)為了三個方面:動態(tài)類型、動態(tài)綁定、動態(tài)加載。之所以叫做動態(tài),是因?yàn)楸仨毜竭\(yùn)行時(run time)才會做一些事情。(1)動態(tài)類型動態(tài)類型,說簡單點(diǎn)就是id類型。動態(tài)類型是跟靜態(tài)類型相對的。像內(nèi)置的明確的基本類型都屬于靜態(tài)類型(int、NSString等)。靜態(tài)類型在編譯的時候就能被識別出來。所以,若程序發(fā)生了類型不對應(yīng),編譯器就會發(fā)出警告。而動態(tài)類型就編譯器編譯的時候是不能被識別的,要等到運(yùn)行時(run time),即程序運(yùn)行的時候才會根據(jù)語境來識別。所以這里面就有兩個概念要分清:編譯時跟運(yùn)行時。(2)動態(tài)綁定動態(tài)綁定(dynamic binding)貌似比較難記憶,但事實(shí)上很簡單,只需記住關(guān)鍵詞@selector/SEL即可。先來看看“函數(shù)”,對于其他一些靜態(tài)語言,比如c++,一般在編譯的時候就已經(jīng)將將要調(diào)用的函數(shù)的函數(shù)簽名都告訴編譯器了。靜態(tài)的,不能改變。而在OC中,其實(shí)是沒有函數(shù)的概念的,我們叫“消息機(jī)制”,所謂的函數(shù)調(diào)用就是給對象發(fā)送一條消息。這時,動態(tài)綁定的特性就來了。OC可以先跳過編譯,到運(yùn)行的時候才動態(tài)地添加函數(shù)調(diào)用,在運(yùn)行時才決定要調(diào)用什么方法,需要傳什么參數(shù)進(jìn)去。這就是動態(tài)綁定,要實(shí)現(xiàn)他就必須用SEL變量綁定一個方法。最終形成的這個SEL變量就代表一個方法的引用。這里要注意一點(diǎn):SEL并不是C里面的函數(shù)指針,雖然很像,但真心不是函數(shù)指針。SEL變量只是一個整數(shù),他是該方法的ID。以前的函數(shù)調(diào)用,是根據(jù)函數(shù)名,也就是字符串去查找函數(shù)體。但現(xiàn)在,我們是根據(jù)一個ID整數(shù)來查找方法,整數(shù)的查找字自然要比字符串的查找快得多!所以,動態(tài)綁定的特定不僅方便,而且效率更高。(3)動態(tài)加載就是根據(jù)需求動態(tài)地加載資源。我對動態(tài)加載比較陌生,所以就沒什么可總結(jié)的啦。等以后慢慢完善
?
轉(zhuǎn)載于:https://www.cnblogs.com/xsmhero/p/3544212.html
總結(jié)
- 上一篇: 如何改变自己
- 下一篇: VMware手动启动USB Arbitr