runtime的訊息機制

2021-07-24 07:03:07 字數 1643 閱讀 3487

一,runtime的簡介:

runtime簡稱執行時。object-c就是執行時機制也就是執行時候的一些機制。其中最主要的就是訊息機制。

1>和c語言的區別

c語言:函式的呼叫在編譯的時候就決定了呼叫那個函式。

oc語言:它的呼叫是個動態呼叫過程,也就是說在編譯階段並不能決定真正呼叫哪個函式,只有在真正執行的時候

才會根據函式的名稱找到對應的函式來呼叫。

所以綜合如下:

1.在編譯階段,c語言在呼叫未實現的函式就會報錯。

2.在編譯階段,oc可以呼叫任何函式,即使這個函式並未實現,只要宣告就不會報錯。

2>runtime在ios實際開發中它的價值毋庸置疑,能為我們實現很多**的功能,並且它比較偏底層,執行速度也是很快的。

所以後面一點點的來進行講解,首先聊下它的訊息機制,因為oc的底層實現就是通過runtime來實現的,且其任何方法的呼叫

本質就是傳送訊息。

二,runtime訊息機制

1.使用訊息機制的前提,必須匯入

#import

2.可以在終端把oc轉化成c++**,使用命令clang -rewrite-objc main.m

三,看下具體的操作。

1.為了簡便,先用命令列建立乙個專案

2.在main函式裡面我們輸入下面的**

#import int main(int argc, const char * argv) 

return 0;

}

3.開啟終端,進入main.m所在的目錄下,然後輸入命令:clang -rewrite-objc main.m

執行完成後,可以看到在main.m所在的資料夾中生成了main.cpp檔案

4.雙擊開啟,我們可以發現生成了很多**,我們找到最主要的**,搜尋

@autoreleasepool

,可以發現我們熟悉的**,如下圖所示

5.對**進行簡化,因為**前面加上型別,是有強行型別轉換的作用的,不防我們刪掉來看,**如下

id obj = objc_msgsend(objc_getclass("nsobject"), sel_registername("alloc"));

obj = objc_msgsend(obj, sel_registername("init"));

6.對比我們很容易就得出對應關係。

三,對上面所用的函式進行解答

方法呼叫的本質就是讓物件傳送訊息

//此方法為傳送訊息的方法

//第乙個引數:傳送訊息的物件

//第二個引數:傳送物件實現方法的名稱

objc_msgsend(, )

//獲取乙個類物件

objc_getclass()

//註冊乙個方法

sel_registername()

需要強調一點的是獲取物件和註冊方法函式裡面的引數不是隨便寫的,而是系統內部存在這樣的才行,否則會報錯

初識 Runtime機制 傳送訊息

runtime 簡稱執行時,耳熟能詳,其中最主要的就是訊息機制 1.對於c語言,函式的呼叫在編譯的時候就會決定呼叫哪個函式 2.對於oc的函式 屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式,只有在真正執行的時候才會根據函式的名稱找到對應的函式來呼叫。1.在編譯階段,oc可以呼叫任何函式,...

Objective C 之Runtime訊息機制

最近在找工作,objective c中的runtime是經常被問到的乙個問題,幾乎是面試大公司必問的乙個問題。當然還有一些其他問題也幾乎必問,例如 runloop,block,記憶體管理等。其他的問題如果有機會我會在其他文章中介紹。本篇文章主要介紹runtime。runtime簡稱執行時。就是系統在...

runtime執行機制

這篇文章主要介紹的是runtime是什麼以及怎麼用!希望對讀者有所幫助!第乙個問題,1 runtime實現的機制是什麼,怎麼用,一般用於幹嘛?runtime是一套比較底層的純c語言api,屬於1個c語言庫,包含了很多底層的c語言api。在我們平時編寫的oc 中,程式執行過程時,其實最終都是轉成了ru...