最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2012年11月21日 17:19:46   作者:  
Objective-C語言中方法的傳遞有二種:①Selector ② Blocks,本文主要說一下Selector,本文以O(shè)bjective-C 消息傳遞機(jī)制進(jìn)行詳細(xì)介紹,關(guān)于Blocks會(huì)在后續(xù)總結(jié)一下

Objective-C語言中方法的傳遞有二種:①Selector ② Blocks,本文主要說一下Selector,關(guān)于Blocks會(huì)在后續(xù)總結(jié)一下。

消息傳遞模型(Message Passing)是Objective-C語言的核心機(jī)制。在Objective-C中,沒有方法調(diào)用這種說法,只有消息傳遞。

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

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

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

Objective-C就是通過上述方法來查找調(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:,@"嗚嗚",@"嘻嘻"),類似如objc_msgSend(id receiver, SEL selector, parm1,parm2,...)。

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

    根據(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è)類的時(shí)候,每個(gè)類必須包含二個(gè)必要的元素:

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

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

查找過程如下

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

相關(guān)文章

  • C語言測(cè)試n的階乘和x的n次方

    C語言測(cè)試n的階乘和x的n次方

    今天小編就為大家分享一篇關(guān)于C語言測(cè)試n的階乘和x的n次方,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • C++中異常處理的基本思想及throw語句拋出異常的使用

    C++中異常處理的基本思想及throw語句拋出異常的使用

    這篇文章主要介紹了C++中異常處理的基本思想及throw類拋出異常的使用,也深入談到了異常被拋出后的棧解旋unwinding過程,需要的朋友可以參考下
    2016-03-03
  • 數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解

    數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++中std::find函數(shù)介紹和使用場(chǎng)景

    C++中std::find函數(shù)介紹和使用場(chǎng)景

    std::find函數(shù)是一個(gè)非常實(shí)用的通用查找算法,適用于各種場(chǎng)景,本文主要介紹了C++中std::find函數(shù)介紹和使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C++命名空間5種常見用法實(shí)例解析

    C++命名空間5種常見用法實(shí)例解析

    這篇文章主要介紹了C++命名空間5種常見用法實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • C++?構(gòu)造函數(shù)學(xué)習(xí)筆記

    C++?構(gòu)造函數(shù)學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++?構(gòu)造函數(shù)學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Qt實(shí)現(xiàn)字符串生成二維碼功能

    Qt實(shí)現(xiàn)字符串生成二維碼功能

    這篇文章主要介紹了如何利用Qt實(shí)現(xiàn)字符串生成二維碼功能,文中的實(shí)現(xiàn)過程講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2022-01-01
  • C++鏈表倒序?qū)崿F(xiàn)方法

    C++鏈表倒序?qū)崿F(xiàn)方法

    這篇文章主要介紹了C++鏈表倒序?qū)崿F(xiàn)方法,是一個(gè)很經(jīng)典的C++鏈表操作實(shí)例,需要的朋友可以參考下
    2014-08-08
  • C語言實(shí)現(xiàn)車輛信息管理系統(tǒng)

    C語言實(shí)現(xiàn)車輛信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)車輛信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解

    C語言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解

    這篇文章主要為大家詳細(xì)介紹了C語言利用棧實(shí)現(xiàn)對(duì)后綴表達(dá)式的求解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評(píng)論

花垣县| 麦盖提县| 杭州市| 高台县| 扎赉特旗| 阳西县| 赫章县| 宜川县| 崇信县| 平昌县| 会泽县| 元谋县| 北碚区| 定安县| 阳谷县| 阜阳市| 凉城县| 临潭县| 那坡县| 桐城市| 阜平县| 同心县| 鄂州市| 双城市| 黄陵县| 保靖县| 明星| 大荔县| 武宁县| 岳普湖县| 宁强县| 涞源县| 平原县| 神木县| 武强县| 米易县| 于田县| 樟树市| 陇南市| 乌鲁木齐市| 永州市|