如何理解runtime

runtime

提及runtime 只要是oc 開發者都是不陌生的,咱們講到runtime的內容,都是說運行時機制,消息轉發啊什麼的。

是的 ,runtime理解起來並無那麼的可怕。在這裏 ,我就簡單的講講我對runtime方面的理解。api

#運行 方法的查找分爲三個部分 彙編/C和C++/消息轉發緩存

彙編:併發

1 object_send

1:最開始調用的api 當程序執行[object doSomething]時,會向消息接收者(object)發送一條消息(doSomething),runtime會根據消息接收者是否能響應該消息而作出不一樣的反應。這就是消息傳遞,咱們將在後面詳細介紹。 2:不少初學 Objective-C 的人都會把概述中得那句[object doSomething]當成簡單的方法調用吧,而忽視了「發送消息」這幾個字的深入含義。其實[object doSomething]應該用[receiver message]來表示,這樣的表述更加精確,容易理解,[receiver message]會被編譯器轉化爲:objc_msgSend(receiver, selector),若是消息有參數則轉化爲objc_msgSend(receiver, selector, arg1, arg2, ...); ##2 cachelookup oc 運行時中用於存儲imp的緩存策略。在運行中,查詢緩存 ,查詢的緩存imp 是存在的,那麼 直接調用call imp.(其中要說到cacheHit/cachemiss/以及add) 若查詢失敗cachemiss,未查找到imp 緩存,那麼就發送msg_send_uncache(), 跟到methodtablelookup 去調用C的api(lookupmethodandloadcache3)表示對緩存讀取失去信心。此時前往新的方式C,C++的處理方式。函數

###C C++ 1:lookUpIMPforward (屢次調用) ,realizeClass(實現類),classinitlize(初始化類) 2:方法列表中查找 calss_resolveMethod ----> _class_resoveInstanceMethon (當前類 方法列表的查找)---->_class_resoveClassMethon(父類方法列表查找) 以上都未能查找到方法imp 則進入三次挽回的方法中對象

##消息轉發 forwardingTargetForSelector 在oc的中 未能實現以上的查找方式 則咱們能夠在代碼中實現 備用者去轉發消息如a 的方法中沒有一個walk的方法,可是咱們對a 執行[a walk]的房後後,由於未發現這個方法,會形成程序崩潰,可是咱們能夠在forwardingTargetForSelector 進行備用方法處理,好比 if (Selector == @(walk)) 則return [B new] 返回B對象去接受這個消息。 這樣程序就不會早承崩潰。開發

若是在上一步還不能處理未知消息,則惟一能作的就是啓用完整的消息轉發機制了。 首先它會發送-methodSignatureForSelector:消息得到函數的參數和返回值類型。若是-methodSignatureForSelector:返回nil,Runtime則會發出-doesNotRecognizeSelector:消息,程序這時也就掛掉了。若是返回了一個函數簽名,Runtime就會建立一個NSInvocation對象併發送-forwardInvocation:消息給目標對象。get

以上即是JZ對runtime的部分理解,有問題歡迎指正。編譯器

相關文章
相關標籤/搜索