OC的動態特性

 

          OC做爲一門面嚮對象語言,自然具有面向對象的語言特性,如封裝、繼承、多態。他具有靜態語言的特性(如C++),又有動態語言的效率(動態綁定、動態加載等)。整體來,確實是一門不錯的編程語言。

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

              (1)動態類型   

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

              (2)動態綁定

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

            (3)動態加載

                       就是根據需求動態地加載資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章