oc作為一門面向?qū)ο蟮恼Z言柔昼,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承炎辨、多態(tài)捕透。它既具有靜態(tài)語言的特性(如C++),又有動態(tài)語言的效率(動態(tài)綁定碴萧,動態(tài)加載)乙嘀。總體來講破喻,OC確實是一門不錯的編程語言虎谢。
Object-C具有相當多的動態(tài)特性,表現(xiàn)為三個方面:動態(tài)類型(Dynamic typing)曹质、動態(tài)綁定(Dynamic binding)和動態(tài)加載(Dynamic loding)婴噩。動態(tài)--必須到運行時(run time)才會做的一些事情。
動態(tài)類型:即運行時在決定對象的類型羽德,這種動態(tài)特性在日常的應用中非常的常見几莽,簡單來說就是id類型。事實上宅静,由于靜態(tài)類型的固定性和可預知性章蚣,從而使用的更加的廣泛。靜態(tài)類型在編譯的時候就能識別出來姨夹,所以纤垂,若程序發(fā)生類型不對應矾策,編譯器會發(fā)出警告。動態(tài)類型編譯器編譯的時候是不能識別的洒忧,要等到運行時(run time)蝴韭,即程序運行的時候才會根據(jù)語境識別。靜態(tài)類型是強類型熙侍,而動態(tài)類型屬于弱類型榄鉴,運行時決定接受者。
動態(tài)綁定:基于動態(tài)類型蛉抓,在某個實例對象被確定后庆尘,其類型便被確定了,該對象對應的屬性和響應消息也被完全的確定了巷送。在oc中沒驶忌,函數(shù)的概念,我們叫“消息機制”笑跛。所謂的函數(shù)調(diào)用就是給對象發(fā)一條消息付魔。這時,動態(tài)綁定的特性就來了飞蹂。oc可以先跳過編譯几苍,到運行的時候才動態(tài)的添加和調(diào)用函數(shù),在運行時才決定要調(diào)用什么方法陈哑,需要傳什么參數(shù)進去妻坝,這就是動態(tài)綁定。
動態(tài)加載:根據(jù)需求加載所需要的資源惊窖,最基本就是不同的機型配置刽宪,例如,在Retina設備上加載@2x的圖片界酒,而在老一些的的普通蘋果設備上加載原圖圣拄,讓程序在運行時添加代碼模塊以及其他資源。用戶可根據(jù)需求加載一些可執(zhí)行的代碼資源毁欣,而不是在在啟動的時候就加載所有的組件售担,可執(zhí)行代碼可以含有和程序運行時整合的新類。
補充:
SEL類型:Objective-C在編譯的時候,會根據(jù)方法的名字 (包括參數(shù)序列),生成一個用來區(qū)分這個方法的唯一的一個標示(ID),這個標示(ID)就是SEL類型的,在運行時候是通過方法的標示來查找方法的署辉。只要方法的名字(包括參數(shù)序列)相同,那么它們的 ID都是相同的族铆。