OC為什么是動(dòng)態(tài)語(yǔ)言

每次聽(tīng)到“動(dòng)態(tài)語(yǔ)言”就會(huì)思考一次這個(gè)問(wèn)題包斑,OC為什么是動(dòng)態(tài)語(yǔ)言?不同時(shí)期有不s同的理解件蚕。

最開(kāi)始的理解是盟迟,在運(yùn)行時(shí)才去調(diào)用特定的方法(OC的消息轉(zhuǎn)發(fā)機(jī)制屬于動(dòng)態(tài)性,并不是多態(tài))踱承,編譯時(shí)并不確定將來(lái)運(yùn)行的時(shí)候調(diào)用什么方法倡缠。但是這個(gè)不就是面向?qū)ο蟮亩鄳B(tài)性嗎?一般的面相對(duì)象的語(yǔ)言都會(huì)有多態(tài)性茎活,例如java昙沦,有多態(tài)性,但不是動(dòng)態(tài)語(yǔ)言载荔。

對(duì)于iOS開(kāi)發(fā)人員來(lái)說(shuō)盾饮,除了OC語(yǔ)言,其他的語(yǔ)言接觸的很少懒熙,更不會(huì)深入理解丘损,所以,不會(huì)有兩種語(yǔ)言的對(duì)比工扎,對(duì)于其他語(yǔ)言的了解徘钥,也只是了解一點(diǎn)皮毛,包括我肢娘。這個(gè)是搞iOS呈础,或只搞一個(gè)平臺(tái)帶來(lái)的弊病舆驶。所以,如果只專(zhuān)注在一個(gè)平臺(tái)而钞,更具體點(diǎn)沙廉,專(zhuān)注于一種語(yǔ)言,那么臼节,對(duì)很多概念是無(wú)法理解的撬陵。

在我們需要具備其他一門(mén)語(yǔ)言的時(shí)候,swift來(lái)了官疲,恰巧swift又是一個(gè)靜態(tài)語(yǔ)言袱结,這樣,我們iOS開(kāi)發(fā)者途凫,可以同時(shí)理解動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言了垢夹。

百度百科里關(guān)于動(dòng)態(tài)語(yǔ)言的定義

動(dòng)態(tài)語(yǔ)言,是指程序在運(yùn)行時(shí)可以改變其結(jié)構(gòu):新的函數(shù)可以被引進(jìn)维费,已有的函數(shù)可以被刪除等在結(jié)構(gòu)上的變化果元,類(lèi)型的檢查是在運(yùn)行時(shí)做的,優(yōu)點(diǎn)為方便閱讀犀盟,清晰明了而晒,缺點(diǎn)為不方便調(diào)試。

也就是阅畴,在程序運(yùn)行后倡怎,還可以添加新的函數(shù),或者刪除已有的函數(shù)贱枣,或者添加新的屬性监署,或者刪除已有的屬性,總之纽哥,就是可以修改你之前寫(xiě)好的代碼钠乏。例如,我定義了一個(gè)Person類(lèi)春塌,代碼里只寫(xiě)了一個(gè)屬性name晓避,但是,我可以在別的地方做些操作(寫(xiě)些代碼)只壳,給這個(gè)Person類(lèi)俏拱,添加一個(gè)age屬性,加一個(gè)eat方法等等吕世。

我們做的操作是什么呢彰触?其實(shí)就相當(dāng)于你改了Person類(lèi)的代碼,加上了age屬性命辖,加上了eat方法况毅。

也就是定義里說(shuō)的,

動(dòng)態(tài)語(yǔ)言尔艇,是指程序在運(yùn)行時(shí)可以改變其結(jié)構(gòu)尔许。

我們把原本只有一個(gè)name屬性的Person類(lèi)改的面目全非了。

我們都知道终娃,我們?cè)趺崔k到添加屬性和方法呢味廊?這個(gè)就是我們iOS開(kāi)發(fā)者非常熟悉的runtime。所以棠耕,我們說(shuō)余佛,OC的動(dòng)態(tài)性是runtime支持的。沒(méi)有runtime窍荧,就不具備在運(yùn)行時(shí)修改代碼的能力辉巡。

runtime的確是個(gè)偉大的特性,長(zhǎng)久以來(lái)都是iOS程序員引以為傲的蕊退,但是swift卻去掉了動(dòng)態(tài)性郊楣,原生并不支持runtimeruntime的特性在很多場(chǎng)景下都是最佳的解決方案瓤荔,所以净蚤,swift沒(méi)有runtime特性,的確讓人很不舒服输硝。

swift可以通過(guò)兼容OC來(lái)使用runtime特性今瀑,但始終不是swift的特性。

runtime特性的確有很多的弊端点把,例如執(zhí)行速度上橘荠,肯定是靜態(tài)語(yǔ)言更快。但是動(dòng)態(tài)語(yǔ)言?xún)?yōu)點(diǎn)又顯然超過(guò)了弊端愉粤,所以砾医,在不久的將來(lái)swift一定會(huì)加入runtime特性,當(dāng)然衣厘,到時(shí)可能有一個(gè)新名字如蚜,未必還是叫runtime

runtime在這里我們可以看作一個(gè)庫(kù)影暴,像其他庫(kù)一樣错邦,這個(gè)庫(kù)提供了一些API,讓我們來(lái)實(shí)現(xiàn)添加方法型宙,刪除方法撬呢,交換方法等等。這個(gè)庫(kù)真正做了什么呢妆兑?是不是真的在運(yùn)行的時(shí)候去把我們寫(xiě)好的代碼改掉呢魂拦?例如添加一個(gè)方法毛仪,是不是真的在我們的代碼下面再寫(xiě)一個(gè)我們添加的方法呢?我們知道另外一件事芯勘,就是ARC的實(shí)現(xiàn)機(jī)制箱靴,ARC并不是垃圾回收機(jī)制,而是荷愕,在編譯的時(shí)候衡怀,系統(tǒng)真的會(huì)給我們加上代碼(releaseretain安疗,autorelease等)抛杨。那runtime是不是呢?顯然不是荐类,runtime是在運(yùn)行的時(shí)候起作用的怖现,那個(gè)時(shí)候,代碼已經(jīng)完成了編譯掉冶,怎么還能改代碼呢真竖?所以,真正的改代碼只能發(fā)生在編譯前厌小,編譯之后就沒(méi)有辦法改代碼了恢共。

我們知道,OC里有很多庫(kù)都是C/C++實(shí)現(xiàn)的璧亚,包括runtime庫(kù)讨韭,為什么是C/C++實(shí)現(xiàn)?因?yàn)樗械?code>OC在編譯之前都會(huì)轉(zhuǎn)為C/C++代碼癣蟋,也就是透硝,OC不過(guò)是在C/C++基礎(chǔ)上實(shí)現(xiàn)的一個(gè)語(yǔ)言,瞬間不那么高大上了疯搅。

OC里的類(lèi)濒生,數(shù)組,各種結(jié)構(gòu)幔欧,各種邏輯罪治,最終都是C\C++實(shí)現(xiàn)。例如礁蔗,我們要在OC類(lèi)里添加一個(gè)方法觉义。在C++層面是,OC方法會(huì)轉(zhuǎn)為函數(shù)指針浴井,有一個(gè)數(shù)組存放這些函數(shù)指針晒骇,添加一個(gè)方法就是在這個(gè)數(shù)組里,再添加一個(gè)函數(shù)指針。在OC看來(lái)洪囤,你給這個(gè)類(lèi)添加了一個(gè)方法徒坡。在C++看來(lái),你不過(guò)是在數(shù)組里添加了一個(gè)元素箍鼓,并沒(méi)有什么奇怪的崭参。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呵曹,一起剝皮案震驚了整個(gè)濱河市款咖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奄喂,老刑警劉巖铐殃,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異跨新,居然都是意外死亡富腊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)域帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赘被,“玉大人,你說(shuō)我怎么就攤上這事肖揣∶窦伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵龙优,是天一觀的道長(zhǎng)羊异。 經(jīng)常有香客問(wèn)我,道長(zhǎng)彤断,這世上最難降的妖魔是什么野舶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮宰衙,結(jié)果婚禮上平道,老公的妹妹穿的比我還像新娘。我一直安慰自己供炼,他們只是感情好一屋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著劲蜻,像睡著了一般陆淀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上先嬉,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天轧苫,我揣著相機(jī)與錄音,去河邊找鬼。 笑死含懊,一個(gè)胖子當(dāng)著我的面吹牛身冬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岔乔,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酥筝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了雏门?” 一聲冷哼從身側(cè)響起嘿歌,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茁影,沒(méi)想到半個(gè)月后宙帝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡募闲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年步脓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浩螺。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靴患,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出要出,到底是詐尸還是另有隱情鸳君,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布厨幻,位于F島的核電站相嵌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏况脆。R本人自食惡果不足惜饭宾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望格了。 院中可真熱鬧看铆,春花似錦、人聲如沸盛末。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)悄但。三九已至棠隐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間檐嚣,已是汗流浹背助泽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗡贺。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓隐解,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親诫睬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煞茫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,979評(píng)論 3 119
  • 要是您擁有2013-2015年的honda civic摄凡,換車(chē)可以享有至少$1000的優(yōu)惠和最低0%利率续徽,同時(shí)家庭成...
    owen_3992閱讀 76評(píng)論 0 0
  • 鷓鴣天 陌上田間曾毀芽,塘邊溪畔也捉蛙架谎。 角樓屋頂晨揭瓦炸宵,蔬菜園中夜碎瓜。 他竊棗谷扣,你偷鴨。 我持銳石破窗紗捎琐。 童...
    悠游魚(yú)閱讀 110評(píng)論 2 4
  • 直到這次才真正意義上的面對(duì)士平大爺和鴻飛大爺?shù)氖虑榛嵯眩腿灰庾R(shí)到,十二年的熟悉竟然在剛剛打字的時(shí)候在猶豫士平大爺?shù)拿?..
    熊夢(mèng)圈圈圈閱讀 350評(píng)論 0 0
  • 1.不隨意評(píng)判瑞凑,不管是人還是事末秃;不起心動(dòng)念 2.不受他人影響 不能別人夸就開(kāi)心,別人批評(píng)就難受籽御,關(guān)注重點(diǎn)在自我感受...
    晴天1988閱讀 535評(píng)論 0 0