亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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

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

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

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

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

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

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

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

查找過程如下

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

相關(guān)文章

  • C語言MultiByteToWideChar和WideCharToMultiByte案例詳解

    C語言MultiByteToWideChar和WideCharToMultiByte案例詳解

    這篇文章主要介紹了C語言MultiByteToWideChar和WideCharToMultiByte案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 最新C/C++中的new和delete的實現(xiàn)過程小結(jié)

    最新C/C++中的new和delete的實現(xiàn)過程小結(jié)

    這篇文章主要介紹了C/C++中的new和delete的實現(xiàn)過程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 實例講解C語言編程中的結(jié)構(gòu)體對齊

    實例講解C語言編程中的結(jié)構(gòu)體對齊

    這篇文章主要介紹了C語言編程中的結(jié)構(gòu)體對齊,值得注意的是一些結(jié)構(gòu)體對齊的例子在不同編譯器下結(jié)果可能會不同,需要的朋友可以參考下
    2016-04-04
  • C++取得本機(jī)IP的方法

    C++取得本機(jī)IP的方法

    這篇文章主要介紹了C++取得本機(jī)IP的方法,代碼簡單功能實用,具有不錯的借鑒參考價值,需要的朋友可以參考下
    2014-10-10
  • 淺談內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別詳解

    淺談內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別詳解

    本篇文章是對內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)簡易五子棋游戲

    C++實現(xiàn)簡易五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡易五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • OpenCV?直方圖均衡化的實現(xiàn)原理解析

    OpenCV?直方圖均衡化的實現(xiàn)原理解析

    直方圖均衡化是通過拉伸像素強(qiáng)度分布范圍來增強(qiáng)圖像對比度的一種方法,今天通過本文給大家介紹OpenCV?直方圖均衡化的實現(xiàn)原理解析,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Qt使用SQLite數(shù)據(jù)庫存儲管理圖片文件

    Qt使用SQLite數(shù)據(jù)庫存儲管理圖片文件

    這篇文章主要為大家詳細(xì)介紹了Qt如何使用SQLite數(shù)據(jù)庫實現(xiàn)存儲管理圖片文件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-04-04
  • C++17中的折疊表達(dá)式實現(xiàn)

    C++17中的折疊表達(dá)式實現(xiàn)

    這篇文章主要介紹了C++17中的折疊表達(dá)式實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C++ 構(gòu)造雙向鏈表的實現(xiàn)代碼

    C++ 構(gòu)造雙向鏈表的實現(xiàn)代碼

    本篇文章是對C++中構(gòu)造雙向鏈表的實現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論