1. 程式人生 > >為什麽說OC是運行時語言?什麽是動態類型、動態綁定、動態加載?

為什麽說OC是運行時語言?什麽是動態類型、動態綁定、動態加載?

打包 .cn 自身 left 開發 識別 調用 不能 圖片

轉載:https://www.cnblogs.com/dxb123456/p/5525343.html

動態:

主要是將數據類型的確定由編譯時,推遲到了運行時。

這個問題其實淺涉及到兩個概念,運行時和多態。 簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。

現在,讓我來想想OC的動態語言特性。OC的動態特性表現為了三個方面:動態類型、動態綁定、動態加載。之所以叫做動態,是因為必須到運行時(run time)才會做一些事情。

(1)動態類型

動態類型,說簡單點就是id類型。動態類型是跟靜態類型相對的。像內置的明確的基本類型都屬於靜態類型(int、NSString等)。靜態類型在 編譯的時候就能被識別出來。所以,若程序發生了類型不對應,編譯器就會發出警告。而動態類型就編譯器編譯的時候是不能被識別的,要等到運行時(run time),即程序運行的時候才會根據語境來識別。所以這裏面就有兩個概念要分清:編譯時跟運行時。

id obj = someInstance;

if ([obj isKindOfClass:someClass]) {

someClass *classSpecifiedInstance = (someClass *)obj;

}

(2)動態綁定

動態綁定(dynamic binding)貌似比較難記憶,但事實上很簡單,只需記住關鍵詞@selector/SEL即可。先來看看“函數”,對於其他一些靜態語言,比如 c++,一般在編譯的時候就已經將將要調用的函數的函數簽名都告訴編譯器了。靜態的,不能改變。而在OC中,其實是沒有函數的概念的,我們叫“消息機制”,所謂的函數調用就是給對象發送一條消息。這時,動態綁定的特性就來了。OC可以先跳過編譯,到運行的時候才動態地添加函數調用,在運行時才決定要調 用什麽方法,需要傳什麽參數進去。這就是動態綁定,要實現他就必須用SEL變量綁定一個方法。最終形成的這個SEL變量就代表一個方法的引用。這裏要註意 一點:SEL並不是C裏面的函數指針,雖然很像,但真心不是函數指針。SEL變量只是一個整數,他是該方法的ID,@selector()就是取類方法的編號。以前的函數調用,是根據函數名,也就是 字符串去查找函數體。但現在,我們是根據一個ID整數來查找方法,整數的查找字自然要比字符串的查找快得多!所以,動態綁定的特定不僅方便,而且效率更 高。

由於OC的動態特性,在OC中其實很少提及“函數”的概念,傳統的函數一般在編譯時就已經把參數信息和函數實現打包到編譯後的源碼中了,而在OC中最常使 用的是消息機制。調用一個實例的方法,所做的是向該實例的指針發送消息,實例在收到消息後,從自身的實現中尋找響應這條消息的方法

(3)動態加載

根據需求加載所需要的資源,這點很容易理解,對於iOS開發來說,基本就是根據不同的機型做適配。最經典的例子就是在Retina設備上加載@2x的圖片,而在老一些的普通屏設備上加載原圖。

為什麽說OC是運行時語言?什麽是動態類型、動態綁定、動態加載?