a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

Objective-C消息傳遞的核心機制詳解

2020-02-24 14:37:49
字體:
來源:轉載
供稿:網友

  下面給大家分享一篇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。

  以上就是Objective-C消息傳遞的核心機制詳細解析了,想必都了解了吧,更多相關內容請繼續關注武林技術頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 午夜激情视频在线观看 | 日韩在线二区 | 欧美怡红院视频一区二区三区 | 日韩精品一区二区在线观看 | 国产一区| 九九99久久 | 国产精品视频福利 | 在线视频 中文字幕 | 日韩在线视频观看 | 国产乱精品一区二区三区视频了 | 久久久精品网 | ririsao亚洲国产中文 | 中文字幕视频在线观看 | 亚洲影视一区 | 国产精品1区2区3区 午夜视频网站 | 91在线免费看 | 息与子猛烈交尾一区二区 | 欧美精品一区二区三区蜜桃视频 | 亚洲激情 欧美 | 日韩精品一区二 | 欧洲精品| 精产国产伦理一二三区 | 日韩激情网站 | 九热精品 | 亚洲国产二区三区 | 国产伦精品一区二区三区视频网站 | 黄a在线观看| 香蕉视频成人在线观看 | 美女扒开尿口来摸 | 久久久青草婷婷精品综合日韩 | 91九色在线 | 国产在线精品一区二区三区 | 日韩中文字幕一区二区 | 日韩在线国产精品 | 成人精品一区二区三区中文字幕 | 日韩在线中文字幕视频 | 色综合88 | 精品久久久一区 | 日本在线不卡视频 | 午夜三区 | 久久电影国产免费久久电影 |