iOS之runtime執行機制初探

2021-06-26 21:15:19 字數 1849 閱讀 8004

近有個新入職的同事問我關於「runtime機制」的問題,我想可能很多人對這個都不是太清楚,在這裡,和大家分享一下我對於runtime機制的理解。要深入理解runtime,首先要從最基本的類與物件開始,本文將詳細講解oc中類與物件的結構層次,後續將逐漸更新如何利用runtime操作類。

所謂runtime就是指,在編譯階段並不關心其具體資料型別,到執行到具體的方法時,才去確實其具體的資料型別。

首先,我們從/usr/include/objc/objc.h

和 runtime.h 中找到對 class 與 object 的定義:

1

///an opaque type that represents an objective-c class.

2 typedef struct objc_class *class;34

///represents an instance of a class.

5struct

objc_object ;89

///a pointer to an instance of a class.

10 typedef struct objc_object *id;

由此可見,class是乙個指向objc_class結構體的指標,而id是乙個指向objc_object結構體的指標,其中的成員isa是乙個指向objec_class結構體的指標。

下面我們來看看關於objc_class的定義:

struct

objc_class

可見,類與物件的區別僅僅在於模擬物件的結構體中多了眾多的成員,它們都可以當做乙個objec_object來對待,也就是說類和物件都是物件,為了區別概念,這裡引入乙個術語:類物件(class object)和例項物件(instance object),這樣我們就可以區別物件和類了(可別混淆了哦)。

下面詳細介紹一下objec_class中各成員:

isa:objec_object(例項物件)中isa指標指向的類結構稱為class(也就是該物件所屬的類)其中存放著普通成員變數與動態方法(還記得「-」開頭的方法嗎?);此處isa指標指向的類結構稱為metaclass,其中存放著static型別的成員變數與static型別的方法(「+」開頭的方法)。

super_class: 指向該類的父類的指標,如果該類是根類(如nsobject或nsproxy),那麼super_class就為null。

到這裡我們可以看清楚oc中類與物件的繼承層次關係:

注意點,所有的metaclass中isa指標都是指向根metaclass,而根metaclass則指向自身。根metaclass是通過繼承根類產生的,與根class結構體成員一致,不同的是根metaclass的isa指標指向自身。

>當我們呼叫某個物件的例項方法時,它會首先在自身isa指標指向的類(class)methodlists中查詢該方法,如果找不到則會通過class的super_class指標找到父類的類物件結構體,然後從methodlists中查詢該方法,如果仍然找不到,則繼續通過super_class向上一級父類結構體中查詢,直至根class;

>當我們呼叫某個某個類方法時,它會首先通過自己的isa指標找到metaclass,並從其中methodlists中查詢該類方法,如果找不到則會通過metaclass的super_class指標找到父類的metaclass物件結構體,然後從methodlists中查詢該方法,如果仍然找不到,則繼續通過super_class向上一級父類結構體中查詢,直至根metaclass;

經過以上介紹,相信你已經對oc中物件與類的結構層次有了更深刻的認識。後面將會介紹如何利用runtime機制。

runtime執行機制

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

RunTime的執行機制簡單使用

runtime 是一套比較底層的純c語言api 它是oc的幕後工作者 我們平時寫的oc 在執行時都會編譯器轉為runtime的c語言 其中最主要的是訊息機制oc的函式呼叫,成為訊息傳送 屬於動態呼叫過程 在編譯的時候並不能決定真正呼叫哪個函式事實證明,在編譯階段,oc可以呼叫任何函式,即使這個函式並...

iOS後台執行機制

除了上述四項後台功能,系統還提供乙個程式快速切換的功能,這個功能也算是ios多工的一部分。個人觀點,這個功能是ios多工中最先進最有用的功能。它讓程式在最小化的時候僅僅是暫停執行,但並不釋放記憶體,保持程式當前的狀態,這樣當你再次開啟這個程式的時候,程式不需要重新從硬碟 快閃儲存器 中讀出,不需要重...