標籤:
OC與C++、Java等物件導向語言有很多的類似之處,不過在很多方面也是有所差別的。若是用過某一種物件導向語言,那麼就很容易理解OC語言所用的範式和模板了。但是在文法使用上,也許會顯得陌生。因為OC語言使用了“Messaging Structure(訊息結構)”而非“Function Calling(函數調用)”。訊息與函數調用的基本格式如下(以Student類為例):
//Messaging(OC)
Student *stu=[Student new];
[stu setName:name1 and setAge:age1];
//Function calling(C++)
Student *stu= new Student;
stu->set(name1,age1);
關鍵區別在於:使用訊息結構的語言,其運行時所執行的代碼由運行環境來決定;而使用函數調用的語言,則由編譯器決定。如果範例代碼中調用的函數是多態的,那麼在運行時就要按照“virtual table(虛方法表)”來查出到底應該執行哪個函數實現。而採用訊息結構的語言,不論是否是多態,總是在運行時才會尋找索要執行的方法。實際上,編譯器甚至不關心接受訊息的對象是何種類型。接收訊息的對象問題也要在運行時處理,其過程叫做“dynamic binding(動態綁定)”。
OC語言的重要工作都由“runtime component(運行期組件)”而非編譯器來完成。使用oc的物件導向也行所需要的全部資料結構及函數都在運行期組件裡面。舉例來說,運行期組件中含有全部記憶體管理方法。運行期組件本質上就是一種與開發人員所編代碼相連結的“dynamic library(動態庫)”,其代碼能把開發人員編寫的所有程式粘合起來。這樣的話,只需要更新執行期組件,即可提升應用程式效能。而那中許多工作都在編譯期完成的語言,若想獲得類似的效能提升,則要重新編譯應用程式代碼。
OC是C的superset,所以C的所有功能在編寫OC代碼時依然是適用的。因此,必須同時掌握C與OC這兩門語言的核心概念,方能寫出高效的OC代碼。其中有位重要的是要理解C的記憶體模型,這有助於理解OC的記憶體模型及其“reference counting(引用計數)”機制的工作原理。若要理解記憶體模型,則需要明白:OC語言中的指標是用來指示對象。
Objective-C語言的一些基礎特性