算了算,學習IOS已經有一段時間了。今天花了點時間思考一下OC的語言特性,讓本身的心不要那麼浮躁,注重基礎,迴歸本源。c++
OC作爲一門面向對象語言,天然具備面向對象的語言特性,如封裝、繼承、多態。他具備靜態語言的特性(如C++),又有動態語言的效率(動態綁定、動態加載等)。總體來講,確實是一門不錯的編程語言。編程
如今,讓我來想一想OC的動態語言特性。OC的動態特性表現爲了三個方面:動態類型、動態綁定、動態加載。之因此叫作動態,是由於必須到運行時(run time)纔會作一些事情。編程語言
(1)動態類型函數
動態類型,說簡單點就是id類型。動態類型是跟靜態類型相對的。像內置的明確的基本類型都屬於靜態類型(int、NSString等)。靜態類型在 編譯的時候就能被識別出來。因此,若程序發生了類型不對應,編譯器就會發出警告。而動態類型就編譯器編譯的時候是不能被識別的,要等到運行時(run time),即程序運行的時候纔會根據語境來識別。因此這裏面就有兩個概念要分清:編譯時跟運行時。post
(2)動態綁定學習
動態綁定(dynamic binding)貌似比較難記憶,但事實上很簡單,只需記住關鍵詞@selector/SEL便可。先來看看「函數」,對於其餘一些靜態語言,好比 c++,通常在編譯的時候就已經將將要調用的函數的函數簽名都告訴編譯器了。靜態的,不能改變。而在OC中,實際上是沒有函數的概念的,咱們叫「消息機 制」,所謂的函數調用就是給對象發送一條消息。這時,動態綁定的特性就來了。OC能夠先跳過編譯,到運行的時候才動態地添加函數調用,在運行時才決定要調 用什麼方法,須要傳什麼參數進去。這就是動態綁定,要實現他就必須用SEL變量綁定一個方法。最終造成的這個SEL變量就表明一個方法的引用。這裏要注意 一點:SEL並非C裏面的函數指針,雖然很像,但真心不是函數指針。SEL變量只是一個整數,他是該方法的ID。之前的函數調用,是根據函數名,也就是 字符串去查找函數體。但如今,咱們是根據一個ID整數來查找方法,整數的查找字天然要比字符串的查找快得多!因此,動態綁定的特定不只方便,並且效率更 高。指針
(3)動態加載對象
就是根據需求動態地加載資源。我對動態加載比較陌生,因此就沒什麼可總結的啦。等之後慢慢完善blog