前言
本來打算寫一篇關於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作業系統,然後再讓我們看看各個功能實現的 和過程,包括程序的建立,程...