Objective-C 訊息傳遞機制詳解

來源:互聯網
上載者:User

Objective-C語言中方法的傳遞有二種:①Selector ② Blocks,本文主要說一下Selector,關於Blocks會在後續總結一下。

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

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

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

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

Objective-C就是通過上述方法來尋找調用方法的~比如[itNoob cry]就被轉換成objc_msgSend(itNoob,cry),這裡receiver就是itNoob對象,selector就是cry選取器,當然如果cry擁有參數的話,會同樣被轉換,如[itNoob cry:@"嗚嗚" AndSmile:@"嘻嘻"]會被轉換成objc_msgSend(itNoob,cry:AndSmile:,@"嗚嗚",@"嘻嘻"),類似如objc_msgSend(id receiver, SEL selector, parm1,parm2,...)。

objc_msgSend的動態綁定過程

    根據receiver對象去尋找selector方法的具體實現位置調用尋找到的實現,傳遞參數將方法實現的傳回值作為自己的傳回值,返回

那objc_msgSend的是如何尋找方法的具體實現位置呢,從網上找了一下,如下:

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

指向父類的指標一個調度表(dispatch table),調度表將類的selector與方法的實際記憶體位址關聯起來。

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

尋找過程如下

當想一個對象發送訊息的時候,先根據isa找到所屬的類,然後去尋找該類的dispatch table,如果沒有找到,就去其父類中尋找...如果找到了,就根據調度表中的記憶體位址調用該實現,如果最後一直沒有找到返回nil。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.