Runtime初識(1 基本定義)

2021-09-08 20:20:23 字數 1601 閱讀 4433

runtime 又叫執行時,是一套底層的 c 語言 api,其為 ios 內部的核心之一,我們平時編寫的 oc **,底層都是基於它來實現的。它會將一些工作放在**執行時才處理而並非編譯時。也就是說,有很多類和成員變數在我們編譯的時是不知道的,而在執行時,我們所編寫的**會轉換成完整的確定的**執行。

因此,編譯器是不夠的,我們還需要乙個執行時系統(runtime system)來處理編譯後的**。

runtime 基本是用 c 和彙編寫的,由此可見蘋果為了動態系統的高效而做出的努力。蘋果和 gnu 各自維護乙個開源的 runtime 版本,這兩個版本之間都在努力保持一致。

比如:

[receiver message];

// 底層執行時會被編譯器轉化為:

objc_msgsend(receiver, selector)

// 如果其還有引數比如:

[receiver message:(id)arg...];

// 底層執行時會被編譯器轉化為:

objc_msgsend(receiver, selector, arg1, arg2, ...)

objc_msgsend() 一般引數解析:

引數1:表示給哪個物件傳送訊息

引數2:表示給哪個方法傳送訊息(也是方法編號,一般通過編號找到發放的實現)

引數3:表示傳送訊息的時候帶的引數

objc 在三種層面上與 runtime 系統進行互動:

通過 objective-c 源**

通過 foundation 框架的 nsobject 類定義的方法

通過對 runtime 庫函式的直接呼叫

objective-c 源**

多數情況我們只需要編寫 oc **即可,runtime 系統自動在幕後搞定一切,如果我們呼叫方法,編譯器會將 oc **轉換成執行時**,在執行時確定資料結構和函式。

通過 foundation 框架的 nsobject 類定義的方法

cocoa 程式中絕大部分類都是 nsobject 類的子類,所以都繼承了 nsobject 的行為。(nsproxy 類時個例外,它是個抽象超類)

一些情況下,nsobject 類僅僅定義了完成某件事情的模板,並沒有提供所需要的**。例如-description方法,該方法返回類內容的字串表示,該方法主要用來除錯程式。nsobject 類並不知道子類的內容,所以它只是返回類的名字和物件的位址,nsobject 的子類可以重新實現。

還有一些 nsobject 的方法可以從 runtime 系統中獲取資訊,允許物件進行自我檢查。例如:

通過對 runtime 庫函式的直接呼叫

runtime 系統是具有公共介面的動態共享庫。標頭檔案存放於/usr/include/objc目錄下,這意味著我們使用時只需要引入objc/runtime.h標頭檔案即可。

許多函式可以讓你使用純 c **來實現 objc 中同樣的功能。除非是寫一些 objc 與其他語言的橋接或是底層的 debug 工作,你在寫 objc **時一般不會用到這些 c 語言函式。對於公共介面都有哪些,後面會講到。我將會參考蘋果官方的 api 文件。

runtime基本使用

用法詳見zjrtextfiled 什麼是runtime?1 runtime是一套底層的c語言api 包括很多實用的c語言型別,c語言函式 2 實際上,平時我們編譯的oc 底層都是基於runtime實現的 也就是說,我們平時編寫的oc 最終都是轉成了底層的runtime c語言 執行時 runtime...

初識python 基本操作1

python的資料型別,輸入,輸出運算子,if,while迴圈,函式 1.資料型別 這裡是基本介紹,後面會詳細介紹 python3 中有六個標準的資料型別 classa pass class b a pass isinstance a a returns true type a a returns ...

初識 Runtime機制 傳送訊息

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