runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語言,函式的呼叫在編譯的時候會決定呼叫哪個函式( c語言的函式呼叫請看這裡 )。編譯完成之後直接順序執行,無任何二義性。oc的函式呼叫成為訊息傳送。屬於動態呼叫過程。在編譯的時候並不能決定真正呼叫哪個函式(事實證明,在編 譯階段,oc可以呼叫任何函式,即使這個函式並未實現,只要申明過就不會報錯。而c語言在編譯階段就會報錯)。只有在真正執行的時候才會根據函式的名稱找 到對應的函式來呼叫。
那oc是怎麼實現動態呼叫的呢?下面我們來看看oc通過傳送訊息來達到動態呼叫的秘密。假如在oc中寫了這樣的乙個**:
[obj maketext];其中obj是乙個物件,maketext是乙個函式名稱。對於這樣乙個簡單的呼叫。在編譯時runtime會將上述**轉化成
objc_msgsend(obj,@selector(maketext));首先我們來看看obj這個物件,ios中的obj都繼承於nsobject。
@inte***ce nsobject在nsobjcet中存在乙個class的isa指標。然後我們看看class:
typedef struct objc_class *class;我們可以看到,對於乙個class類中,存在很多東西,下面我來一一解釋一下:struct objc_class
class isa:指向metaclass,也就是靜態的class。一般乙個obj物件中的isa會指向普通的class,這個class中儲存普通成員變數和對 象方法(「-」開頭的方法),普通class中的isa指標指向靜態class,靜態class中儲存static型別成員變數和類方法(「+」開頭的方 法)。
class super_class:指向父類,如果這個類是根類,則為null。
下面一張很好的描述了類和物件的繼承關係:
注意:所有metaclass中isa指標都指向跟metaclass。而跟metaclass則指向自身。root metaclass是通過繼承root class產生的。與root class結構體成員一致,也就是前面提到的結構。不同的是root metaclass的isa指標指向自身。
class類中其他的成員這裡就先不做過多解釋了,下面我們來看看:
@selector (maketext):這是乙個sel方法選擇器。sel其主要作用是快速的通過方法名字(maketext)查詢到對應方法的函式指標,然後呼叫其函 數。sel其本身是乙個int型別的乙個位址,位址中存放著方法的名字。對於乙個類中。每乙個方法對應著乙個sel。所以ios類中不能存在2個名稱相同 的方法,即使引數型別不同,因為sel是根據方法名字生成的,相同的方法名稱只能對應乙個sel。
下面我們就來看看具體訊息傳送之後是怎麼來動態查詢對應的方法的。
首先,編譯器將**[obj maketext];轉化為objc_msgsend(obj, @selector (maketext));,在objc_msgsend函式中。首先通過obj的isa指標找到obj對應的class。在class中先去cache中 通過sel查詢對應函式method(猜測cache中method列表是以sel為key通過hash表來儲存的,這樣能提高函式查詢速度),若 cache中未找到。再去methodlist中查詢,若methodlist中未找到,則取superclass中查詢。若能找到,則將method加 入到cache中,以方便下次查詢,並通過method中的函式指標跳轉到對應的函式中去執行。
IOS高階開發 Runtime(三)
11 系統類的方法實現部分替換 void methodexchange 列印結果 仔細看log 2013 07 26 16 33 22.776 highoc 7104 c07 sssaaaass 2013 07 26 16 33 22.778 highoc 7104 c07 sssaaaass 12...
IOS高階開發 Runtime(三)
11 系統類的方法實現部分替換 void methodexchange 列印結果 仔細看log 2013 07 26 16 33 22.776 highoc 7104 c07 sssaaaass 2013 07 26 16 33 22.778 highoc 7104 c07 sssaaaass 12...
iOS開發Runtime那些事
objective c中的runtime是經常被問到的乙個問題,幾乎是面試大公司必問的乙個問題。當然還有一些其他問題也幾乎必問,例 如 runloop,block,記憶體管理等。本篇文章主要介紹runtime。runtime簡稱執行時。就是系統在執行的時候的一些機制,其中最主要的是訊息機制。對於c語...