国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

Objective-C消息傳遞的核心機(jī)制詳解

2020-02-24 14:37:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  下面給大家分享一篇Objective-C消息傳遞的核心機(jī)制詳細(xì)解析吧,希望對(duì)大家有所幫助哦!

  在C++或Java中調(diào)用某個(gè)類(lèi)的方法,在Objective-C中是給該類(lèi)發(fā)送一個(gè)消息。在C++或Java里,類(lèi)與類(lèi)的行為方法之間的關(guān)系非常緊密,一個(gè)方法必定屬于一個(gè)類(lèi),且于編譯時(shí)就已經(jīng)綁定在一起,所以你不可能調(diào)用一個(gè)類(lèi)里沒(méi)有的方法。而在Objective-C中就比較簡(jiǎn)單了,類(lèi)和消息之間是松耦合的,方法調(diào)用只是向某個(gè)類(lèi)發(fā)送一個(gè)消息,該類(lèi)可以在運(yùn)行時(shí)再確定怎么處理接受到的消息。也就是說(shuō),一個(gè)類(lèi)不保證一定會(huì)響應(yīng)接收到的消息,如果收到了一個(gè)無(wú)法處理的消息,那么程序既不會(huì)出錯(cuò)也不或宕掉,它僅僅是什么都不做,并返回一個(gè)nil【筆者添加:在編譯期是不出錯(cuò)的,符合語(yǔ)義上的理解,但是runtime運(yùn)行時(shí)的話,會(huì)崩潰】。這種設(shè)計(jì)本身也比較符合軟件的隱喻。(非常nice,從網(wǎng)上看到的,copy過(guò)來(lái)了)

  很顯然,既然編譯器不定位方法,那么只有運(yùn)行期定位方法了,Objective-C又是怎么去運(yùn)行期定位方位的呢?

  id objc_msgSend(id receiver, SEL selector, ...)【包含二個(gè)必要參數(shù):receiver(接受者對(duì)象)、selector(方法選擇器)和一個(gè)未知參數(shù)(selector的參數(shù)列表)】

  Objective-C就是通過(guò)上述方法來(lái)查找調(diào)用方法的~比如[itNoob cry]就被轉(zhuǎn)換成objc_msgSend(itNoob,cry),這里receiver就是itNoob對(duì)象,selector就是cry選擇器,當(dāng)然如果cry擁有參數(shù)的話,會(huì)同樣被轉(zhuǎn)換,如[itNoob cry:@"嗚嗚" AndSmile:@"嘻嘻"]會(huì)被轉(zhuǎn)換成objc_msgSend(itNoob,cry:AndSmile:,@"嗚嗚",@"嘻嘻"),類(lèi)似如objc_msgSend(id receiver, SEL selector, parm1,parm2,...)。

  objc_msgSend的動(dòng)態(tài)綁定過(guò)程

  根據(jù)receiver對(duì)象去查找selector方法的具體實(shí)現(xiàn)位置調(diào)用查找到的實(shí)現(xiàn),傳遞參數(shù)將方法實(shí)現(xiàn)的返回值作為自己的返回值,返回

  那objc_msgSend的是如何查找方法的具體實(shí)現(xiàn)位置呢,從網(wǎng)上找了一下,如下:

  編譯器構(gòu)建每個(gè)類(lèi)的時(shí)候,每個(gè)類(lèi)必須包含二個(gè)必要的元素:

  指向父類(lèi)的指針一個(gè)調(diào)度表(dispatch table),調(diào)度表將類(lèi)的selector與方法的實(shí)際內(nèi)存地址關(guān)聯(lián)起來(lái)。

  我們知道每個(gè)對(duì)象都有一個(gè)isa指針,指向所屬類(lèi),通過(guò)這個(gè)isa指針可以找到對(duì)象的所屬類(lèi)和所屬的父類(lèi)...

  查找過(guò)程如下

  當(dāng)想一個(gè)對(duì)象發(fā)送消息的時(shí)候,先根據(jù)isa找到所屬的類(lèi),然后去查找該類(lèi)的dispatch table,如果沒(méi)有找到,就去其父類(lèi)中查找...如果找到了,就根據(jù)調(diào)度表中的內(nèi)存地址調(diào)用該實(shí)現(xiàn),如果最后一直沒(méi)有找到返回nil。

  以上就是Objective-C消息傳遞的核心機(jī)制詳細(xì)解析了,想必都了解了吧,更多相關(guān)內(nèi)容請(qǐng)繼續(xù)關(guān)注武林技術(shù)頻道。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 固阳县| 互助| 沂源县| 桂林市| 达尔| 娄烦县| 永和县| 兰坪| 大同县| 普宁市| 正定县| 慈溪市| 屏山县| 黄大仙区| 新泰市| 九龙城区| 衡东县| 尉氏县| 潮安县| 呼和浩特市| 开远市| 诸城市| 五原县| 晋江市| 吉隆县| 保亭| 苍南县| 宁津县| 凤冈县| 旬阳县| 班戈县| 宕昌县| 桦甸市| 高邑县| 潮安县| 吴旗县| 东宁县| 长乐市| 柘荣县| 九寨沟县| 白朗县|