OC運(yùn)行時(shí)(RunTime)機(jī)制

oc是一個(gè)全動(dòng)態(tài)語(yǔ)言裆蒸,oc的一切都是基于runtime實(shí)現(xiàn)的熔萧!

從以下三方面來(lái)理解runtime吧!

1. 傳統(tǒng)的面向過(guò)程的語(yǔ)言開(kāi)發(fā)僚祷,例如c語(yǔ)言佛致。實(shí)現(xiàn)c語(yǔ)言編譯器很簡(jiǎn)單,只要按照語(yǔ)法規(guī)則實(shí)現(xiàn)一個(gè)LALR語(yǔ)法分析器就可以了辙谜,編譯器優(yōu)化是非常難的topic俺榆,不在這里討論范圍內(nèi),忽略装哆。 這里我們實(shí)現(xiàn)了編譯器其中最最基礎(chǔ)和原始的目標(biāo)之一就是把一份代碼里的函數(shù)名稱罐脊,轉(zhuǎn)化成一個(gè)相對(duì)內(nèi)存地址定嗓,把調(diào)用這個(gè)函數(shù)的語(yǔ)句轉(zhuǎn)換成一個(gè)jmp跳轉(zhuǎn)指令。在程序開(kāi)始運(yùn)行時(shí)候萍桌,調(diào)用語(yǔ)句可以正確跳轉(zhuǎn)到對(duì)應(yīng)的函數(shù)地址宵溅。 這樣很好,也很直白上炎,但是恃逻。。反症。太死板了辛块。everything is per-determined

2. 我們希望靈活,于是需要開(kāi)發(fā)面向?qū)ο蟮恼Z(yǔ)言铅碍,例如c++润绵。 c++在c的基礎(chǔ)上增加了類(lèi)的部分。但這到底意味著什么呢胞谈?我們?cè)趯?xiě)它的編譯器要如何考慮呢尘盼?其實(shí),就是讓編譯器多繞個(gè)彎烦绳,在嚴(yán)格的c編譯器上增加一層類(lèi)處理的機(jī)制卿捎,把一個(gè)函數(shù)限制在它處在的class環(huán)境里,每次請(qǐng)求一個(gè)函數(shù)調(diào)用径密,先找到它的對(duì)象, 其類(lèi)型,返回值午阵,參數(shù)等等,確定了這些后再jmp跳轉(zhuǎn)到需要的函數(shù)享扔。這樣很多程序增加了靈活性同樣一個(gè)函數(shù)調(diào)用會(huì)根據(jù)請(qǐng)求參數(shù)和類(lèi)的環(huán)境返回完全不同的結(jié)果底桂。增加類(lèi)機(jī)制后,就模擬了現(xiàn)實(shí)世界的抽象模式惧眠,不同的對(duì)象有不同的屬性和方法籽懦。同樣的方法,不同的類(lèi)有不同的行為氛魁! 這里大家就可以看到作為一個(gè)編譯器開(kāi)發(fā)者都做了哪些進(jìn)一步的思考暮顺。但是。秀存。捶码。還是死板, 我們?nèi)匀唤衏++是static language。

3. 希望更加靈活或链! 于是我們完全把上面哪個(gè)類(lèi)的實(shí)現(xiàn)部分抽象出來(lái)宙项,做成一套完整運(yùn)行階段的檢測(cè)環(huán)境。這次再寫(xiě)編譯器甚至保留部分代碼里的sytax名稱株扛,名稱錯(cuò)誤檢測(cè)尤筐,runtime環(huán)境注冊(cè)所有全局的類(lèi),函數(shù)洞就,變量等等信息等等盆繁,我們可以無(wú)限的為這個(gè)層增加必要的功能。調(diào)用函數(shù)時(shí)候旬蟋,會(huì)先從這個(gè)運(yùn)行時(shí)環(huán)境里檢測(cè)所以可能的參數(shù)再做jmp跳轉(zhuǎn)油昂,這就是runtime。編譯器開(kāi)發(fā)起來(lái)比上面更加彎彎繞倾贰。但是這個(gè)層極大增加了程序的靈活性冕碟。? 例如當(dāng)調(diào)用一個(gè)函數(shù)時(shí)候,前2種語(yǔ)言匆浙,很有可能一個(gè)jmp到了一個(gè)非法地址導(dǎo)致程序crash, 但是在這個(gè)層次里面安寺,runtime就過(guò)濾掉了這些可能性。 這就是為什么dynamic langauge更加強(qiáng)壯首尼。 因?yàn)榫幾g器和runtime環(huán)境開(kāi)發(fā)人員已經(jīng)幫你處理了這些問(wèn)題挑庶。

好了上面說(shuō)著這么多,我們?cè)俜祷貋?lái)看objective-c.? 現(xiàn)在你是不是能理解這樣的語(yǔ)句了呢软能?

id obj=self;

if ([obj respondsToSelector:@selector(function1:)) {

}

if ([obj isKindOfClass:[NSArray class]] ) {

}

if ([obj conformsToProtocol:@protocol(myProtocol)]) {

}

if ([[obj class] isSubclassOfClass:[NSArray class]]) {

}

[obj someNonExistFunction];

看似很簡(jiǎn)單的語(yǔ)句迎捺,但是為了讓語(yǔ)言實(shí)現(xiàn)這個(gè)能力,語(yǔ)言開(kāi)發(fā)者要付出很多努力實(shí)現(xiàn)runtime環(huán)境查排。這里運(yùn)行時(shí)環(huán)境處理了弱類(lèi)型凳枝、函數(shù)存在檢查工作。runtime會(huì)檢測(cè)注冊(cè)列表里是否存在對(duì)應(yīng)的函數(shù)跋核,類(lèi)型是否正確岖瑰,最后確定下來(lái)正確的函數(shù)地址,再進(jìn)行保存寄存器狀態(tài)了罪,壓棧锭环,函數(shù)調(diào)用等等實(shí)際的操作。

id knife=[Knife grateKnife];

NSArray *monsterList=[NSArray array];

[monsterList makeObjectsPerformSelector:@selector(killMonster:) withObject:knife];

在c,c++年代去完成這個(gè)功能是非常麻煩的泊藕,但是動(dòng)態(tài)語(yǔ)言卻非常簡(jiǎn)單辅辩。

關(guān)于執(zhí)行效率問(wèn)題。 “靜態(tài)語(yǔ)言執(zhí)行效率要比動(dòng)態(tài)語(yǔ)言高”娃圆,這句沒(méi)錯(cuò)玫锋。因?yàn)橐徊糠謈pu計(jì)算損耗在了runtime過(guò)程中。而靜態(tài)語(yǔ)言生成的機(jī)器指令更簡(jiǎn)潔讼呢。正因?yàn)橹肋@個(gè)原因撩鹿,所以開(kāi)發(fā)語(yǔ)言的人付出很大一部分努力為了保持runtime小巧上。所以objecitve-c是c的超集+一個(gè)小巧的runtime環(huán)境悦屏。但是节沦,換句話說(shuō)键思,從算法角度考慮,這點(diǎn)復(fù)雜度不算差別的甫贯,Big O notation結(jié)果不會(huì)有差別吼鳞。( It's not log(n) vs n^2 )

簡(jiǎn)單理解:“Runtime is everything between your each function call.”

Runtime好比objective-c的靈魂。很多東西都是在這個(gè)基礎(chǔ)上出現(xiàn)的叫搁。所以它是指的你花功夫去理解的赔桌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市渴逻,隨后出現(xiàn)的幾起案子疾党,更是在濱河造成了極大的恐慌,老刑警劉巖惨奕,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雪位,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡墓贿,警方通過(guò)查閱死者的電腦和手機(jī)茧泪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)聋袋,“玉大人队伟,你說(shuō)我怎么就攤上這事∮睦眨” “怎么了嗜侮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)啥容。 經(jīng)常有香客問(wèn)我锈颗,道長(zhǎng),這世上最難降的妖魔是什么咪惠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任击吱,我火速辦了婚禮,結(jié)果婚禮上遥昧,老公的妹妹穿的比我還像新娘覆醇。我一直安慰自己,他們只是感情好炭臭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布永脓。 她就那樣靜靜地躺著,像睡著了一般鞋仍。 火紅的嫁衣襯著肌膚如雪常摧。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天威创,我揣著相機(jī)與錄音落午,去河邊找鬼谎懦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛板甘,可吹牛的內(nèi)容都是我干的党瓮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盐类,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了呛谜?” 一聲冷哼從身側(cè)響起在跳,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隐岛,沒(méi)想到半個(gè)月后猫妙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聚凹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年割坠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妒牙。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彼哼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出湘今,到底是詐尸還是另有隱情敢朱,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布摩瞎,位于F島的核電站拴签,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旗们。R本人自食惡果不足惜蚓哩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望上渴。 院中可真熱鬧岸梨,春花似錦、人聲如沸驰贷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)括袒。三九已至次兆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锹锰,已是汗流浹背芥炭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工漓库, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人园蝠。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓渺蒿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親彪薛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茂装,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 原文出處:南峰子的技術(shù)博客 Objective-C語(yǔ)言是一門(mén)動(dòng)態(tài)語(yǔ)言,它將很多靜態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事放到了...
    _燴面_閱讀 1,229評(píng)論 1 5
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉善延,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評(píng)論 0 9
  • Objective-C語(yǔ)言是一門(mén)動(dòng)態(tài)語(yǔ)言少态,他將很多靜態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事情放到了運(yùn)行時(shí)來(lái)處理。這種動(dòng)態(tài)語(yǔ)言...
    tigger丨閱讀 1,398評(píng)論 0 8
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,139評(píng)論 30 470
  • IHFTabBarController 使用方法類(lèi)似系統(tǒng)的TabBarController易遣。github地址:ht...
    爭(zhēng)気閱讀 235評(píng)論 0 0