IOS runtime動態執行時一

2021-09-07 01:36:57 字數 1149 閱讀 6367

對執行時不太了解,今天小夥伴橄欖油陳高給發了個鏈結 ,看了一部分先存著以後慢慢品  

今天一句一句的讀了下 ,慢慢有了點感覺,把主要的截圖貼在這以後好多看幾遍

typedef struct objc_class *class;

struct

objc_class

class isa:指向metaclass,也就是靜態的class。一般乙個obj物件中的isa會指向普通的class,這個class中儲存普通成員變數和對 象方法(「-」開頭的方法),普通class中的isa指標指向靜態class,靜態class中儲存static型別成員變數和類方法(「+」開頭的方 法)。

class super_class:指向父類,如果這個類是根類,則為null。

isa是橫向,物件--->普通類--->靜態類,靜態類指向根的isa,根的指向自己

superclass是縱向,子類--->父類,根的superclass為null

@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動態執行時一

對執行時不太了解,今天小夥伴橄欖油陳高給發了個鏈結 看了一部分先存著以後慢慢品 今天一句一句的讀了下 慢慢有了點感覺,把主要的截圖貼在這以後好多看幾遍 typedef struct objc class class struct objc class class isa 指向metaclass,也就...

iOS runtime執行時詳解

記錄一下之前的學習內容 viewcontroller.m中 棧 是高位址往低走 堆是低位址往高走 堆疊溢位 堆和棧 被分配到記憶體區域的兩邊 分別往中間儲存,存滿碰頭就會溢位 這是乙個方法 oc方法的本質 c函式 函式呼叫棧 void viewdidload self viewdidload 會導致...

iOS runtime 執行時 二 深談

attention!逆天的來了 我們在程式設計過程中,如果使用到了runtime 執行時 我們幾乎都是想動態的改變這個類的資訊,包括方法,屬性,balabala的,並且獲得這個類的一些資訊,等等,下面我們就來看看怎麼通過runtime提供的方法,來達到這些目的 1 獲取 這個類的所有屬性 h 檔案 ...