麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

編寫高質量OC代碼52建議總結:11.理解objc_msgSend的作用(消息機制)

2019-11-09 15:41:05
字體:
來源:轉載
供稿:網友

在對象上調用方法,術語叫做“傳遞消息”,消息有“名稱”和“選擇器(方法)”,可以接收參數,還可能有返回值。OC是C的超集,C語言使用靜態綁定,在編譯期間就能決定運行時做調用的函數。

#include <stdio.h>void PRintHello() {    printf("hello, world!/n");}void printGoodbye() {    printf("Goodbye, world!/n");}void doTheThing(int type) {    if (type == 0) {        printHello();    } else {        printGoodbye();    }}編譯器在編譯代碼的時候就知道有printHello和printGoodbye兩個函數了,會直接生成調用這些函數的指令,函數地址實際上是硬編碼在指令之中。

#include <stdio.h>void printHello() {    printf("hello, world!/n");}void printGoodbye() {    printf("Goodbye, world!/n");}void doTheThing(int type) {    void (*fnc)();    if (type == 0) {        fnc = printHello;    } else {        fnc = printGoodbye;    }    fnc();}如果代碼變成這樣,就得使用“動態綁定”,因為所要調用的函數直到運行期才能確定,第一個例子中,if 和 else 中都有函數調用指令,第二個例子中只有一個函數調用指令,待調用的函數地址無法硬編碼在指令中,要在運行期讀取出來。

給對象發送消息可以這么寫:

id returnValue = [someObject messageName:parameter];someObject叫做“接受者”,messageName叫做“選擇器”,選擇器與參數合起來叫做“消息”。編譯器將上述語句轉換為C語言函數調用 “objc_msgSend”

void objc_msgSend(id self, SEL cmd, ...)這是個“參數個數可變的函數”,能接受兩個或兩個以上的參數。第一個參數代表接受者,第二個參數代表選擇器,后續參數是消息中的參數編譯器會把剛才的例子轉換為如下函數。

id returnValue = objc_msgSend(someObject, @selector(messageName:), parameter);objc_msgSend 會在接受者所屬的類中搜尋其“方法列表”,如果找到與“選擇器”名稱相符的代碼就實現,沒找到就延繼承體系向上查找,最終找不到,就實現“消息轉發”。

備注:每個類都有一塊緩存“快速映射表”,如果稍后還向該類發送相同的消息,執行就快。

運行環境中一些“邊界情況”,需要其他函數處理  1.objc_msgSend_stret:如果待發送的消息要返回結構體,交給這個函數。  2.objc_msgSend_fpre:如果消息返回的是浮點數,交給這個函數。  3.objc_msgSendSuper:給超類發消息,用這個函數。也有與objc_msgSend_fpre和objc_msgSend_fpre等效的處理超類消息的方法。 

OC對象的每個方法都可以看做簡單的C函數,原型如下:

<return_type> Class_selector(id self, SEL _cmd, ...)每個類里都會有一張表格,其中的指針都會指向這種函數,選擇器的名稱則是查表時用的“鍵”,objc_msgSend用這張表來尋找應該執行的方法并跳轉實現。   

“尾調用優化”:如果函數的最后一項操作是調用另外一個函數,編譯器會生成調轉至另一個函數所用的指令碼。不會向調用堆棧中推入新的“棧幀”。注意:只有當函數的最后一項操作僅僅是調用其他函數而不會將其返回值另做他用時


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久久久久久久淑女av国产精品 | 免费午夜网站 | 小雪奶水翁胀公吸小说最新章节 | 久久久久久亚洲国产精品 | 日韩欧美激情视频 | 国产精品成人亚洲一区二区 | 亚洲最大久久 | 91精品最新国内在线播放 | 国产福利视频在线观看 | 日本在线视频免费观看 | 色天天综合网 | 毛片在线免费观看网址 | 久久人人做 | 欧美黄色三级视频 | 又黄又爽免费无遮挡在线观看 | 香蕉国产在线视频 | 快播av在线 | 国产精品999在线观看 | 国产精品一区二区三区99 | h视频在线免费观看 | 一级看片免费视频 | 日本视频免费 | 黄色免费电影网址 | 99精品国产一区二区三区 | 久久久久久久久久久久久久av | 久久精品中文字幕一区 | 一级黄色国产视频 | 一区二区三区小视频 | 欧美成人一区二区三区 | 日韩.www | 深夜免费视频 | 国产成人综合在线观看 | 青青国产在线视频 | 视频久久免费 | 精品国产91久久久久久 | 久久久久久久一区二区三区 | 国产精品久久久久久久av | 999精品国产 | 国产女厕一区二区三区在线视 | avlululu| 黄a大片|