runtime學習總結 趙鵬舉

2021-07-24 14:19:51 字數 2784 閱讀 6848

前言

本來打算寫一篇關於runtime的學習總結,無奈長篇大論不是我的風格,就像寫申論一樣痛苦,加之網上關於tuntime的文章多如牛毛,應該也夠童子們學習的了,今天就隨便聊聊我的理解吧。

runtime是什麼

對於初學者,runtime如尼斯湖水怪一樣,只存在於傳說中,對於開發者,runtime是做好ios開發,或是深刻掌握objective c所必需理解的東西。大公司面試都喜歡問:你對runtime熟悉嗎?並不是runtime在開發中經常用到,我認為它是oc最核心的部分,只有掌握好它,你才能理解其底層的原理,而不是做乙個只會造輪子的碼農。要練成蓋世神功,需先奠定自身深厚的內功,而tuntime就是ios開發中的內功。

那麼runtime到底是什麼鬼?

runtime是乙個c和彙編寫的動態庫(感謝lision的指正),它就像乙個小小的系統,將oc和c緊密關聯,這個系統主要做兩件事 :

1、封裝c語言的結構體和函式,讓開發者在執行時建立、檢查或者修改類、物件和方法等等。

2、傳遞訊息,找出方法的最終執行**。

聽起來蠻抽象的,我們來點通俗的吧?沒問題~~

我們先寫一句oc的**

[zhangsan walkthedog];

那麼在執行時runtime會將它轉化成c語言的**

objc_msgsend(zhangsan, @selector(walkthedog));

這個方法就是傳送訊息的方法,類似這樣的方法runtime提供了很多,比如:

objc_property_t * class_copypropertylist ( class cls, unsigned int *outcount ); // 獲取屬性列表

method * class_copymethodlist ( class cls, unsigned int *outcount ); // 獲取所有方法的陣列

bool class_addmethod ( class cls, sel name, imp imp, const char *types ); // 新增方法

那麼我們可以利用這些方法幹點什麼?

1、遍歷物件的屬性

比如,看看zhangsan的有哪些屬性(身高:180、年齡:18)

2、動態新增/修改屬性,動態新增/修改/替換方法

比如,修改zhangsan的身高為190、年齡為20,替換walkthedog方法(變成walkthebigdog),給他新增乙個新方法(walkthecat)等等

3、動態建立類/物件/協議等等

比如,建立乙個新的物件:lisi

4、方法攔截呼叫

比如,給zhangsan傳送乙個walkthedog訊息,但是zhangsan不知道怎麼walk啊(沒實現該方法),那我們可以攔截下,給該方法動態新增乙個實現,甚至可以講該方法定向或者打包給lisi(其他物件),讓lisi來walk。

以上就是runtime的通俗解釋,只是稍微舉個例子,更多用法大家可以發揮聰明才智,舉一反三。

方法呼叫流程

通俗地講,呼叫方法(包含例項方法和類方法)相當於給乙個物件傳送訊息。

所以,實際上,類本身也是乙個物件(關於class這一塊就不再這裡展開了)。

當我們呼叫乙個方法時,是這樣的:

instance:呼叫例項方法時,會到物件所屬的類的方法列表中查詢。

class:呼叫類方法時,會到類的metaclass的方法列表中查詢。

下面以例項物件呼叫方法[blackdog walk]為例描述方法呼叫的流程:

1、編譯器會把[blackdog walk]轉化為objc_msgsend(blackdog,sel),sel為@selector(walk)。

2、runtime會在blackdog物件所對應的dog類的方法快取列表裡查詢方法的sel

3、如果沒有找到,則在dog類的方法分發表查詢方法的sel。(類由物件isa指標指向,方法分發表即methodlist)

4、如果沒有找到,則在其父類(設dog類的父類為animal類)的方法分發表裡查詢方法的sel(父類由類的superclass指向)

5、如果沒有找到,則沿繼承體系繼續下去,最終到達nsobject類。

6、如果在234的其中一步中找到,則定位了方法實現的入口,執行具體實現

7、如果最後還是沒有找到,會面臨兩種情況:

(1) 如果是使用`[blackdog walk]`的方式呼叫方法

(2) 使用`[blackdog performselector:@selector(walk)]`的方式呼叫方法

第一種情況編譯器會報錯,第二種需要到執行時才能確定物件能否接收指定的訊息,這時候會進入訊息**的流程:

訊息**流程

1、動態方法解析

接收到未知訊息時(假設blackdog的walk方法尚未實現),runtime會呼叫+resolveinstancemethod:(例項方法)或者+resolveclassmethod:(類方法)

在該方法中,我們可以給未知訊息新增乙個已經實現了的方法。

void walkfunc(id self, sel _cmd)

本文主要通俗地描述了runtime的概念,並對其主要作用做了簡單的概括,旨在給讀者拋磚引玉,runtime的奧妙之處就由讀者多多探索學習了。

初學者需要更深入地學習:

1、基本概念:class、ivar、method等等

2、訊息**機制

3、在objc/runtime.h中理解runtime提供的方法和功能

4、在實際開發中如何靈活運用runtime

iOS開發 RunTime總結篇

在學習runtime的基礎時,我們要搞清楚一些重要的東西,一些專業術語 我們可以從這些東西裡獲取到指定類的所有資訊,無論是公開的,還是私有的,全部都可以拿到,並且操作.作為乙個開發者,有乙個學習的氛圍跟乙個交流圈子特別重要,這是乙個我的ios 413038000,不管你是大牛還是小白都歡迎入駐 分享...

OC 最實用的Runtime 總結

什麼是runtime?runtime 是 oc底層的一套c語言的api 引入 或 編譯器最終都會將oc 轉化為執行時 通過終端命令編譯.m 檔案 clang rewrite objc m可以看到編譯後的 cpp c 檔案 比如我們建立了乙個物件 nsobject alloc init 最終被轉換為幾...

20135320趙瀚青LINUX期中總結

本學期的linux核心這門課程已經進行了一半,這門課的學習方法和上個學期深入理解計算機系統的方式差不多,所以也沒有特別多不適應,linux核心在我看來,就是理解乙個作業系統是如何實現各個功能的,先從巨集觀上讓我們理解一下,linux作業系統,然後再讓我們看看各個功能實現的 和過程,包括程序的建立,程...