runtime

1id蚜迅、class指針

class指針只向objc_class結構體

id指針只向objc_object結構體

isa是一個指向objc_class結構體(該對象所屬的類)

id是對象敢艰,class是類

struct objc_object {

Class isaOBJC_ISA_AVAILABILITY;

};

objc_class的定義如下

typedef struct objc_class *Class;

struct objc_class {

Class isaOBJC_ISA_AVAILABILITY; // metaclass

#if !__OBJC2__

Class super_classOBJC2_UNAVAILABLE; //父類

const char *nameOBJC2_UNAVAILABLE; //類名

long versionOBJC2_UNAVAILABLE; //類的版本信息诬乞,默認為0,可以通過runtime函數(shù)class_setVersion或者class_getVersion進行修改钠导、讀取

long infoOBJC2_UNAVAILABLE; //類信息震嫉,供運行時期使用的一些位標識,如CLS_CLASS (0x1L)表示該類為普通class牡属,其中包含實例方法和變量;CLS_META (0x2L)表示該類為metaclass票堵,其中包含類方法;

long instance_sizeOBJC2_UNAVAILABLE; //該類的實例變量大小(包括從父類繼承下來的實例變量)

struct objc_ivar_list *ivarsOBJC2_UNAVAILABLE; //該類的成員變量地址列表

struct objc_method_list **methodListsOBJC2_UNAVAILABLE; //方法地址列表逮栅,與info的一些標志位有關悴势,如CLS_CLASS (0x1L),則存儲實例方法措伐,如CLS_META (0x2L)特纤,則存儲類方法;

struct objc_cache *cacheOBJC2_UNAVAILABLE; //緩存最近使用的方法地址,用于提升效率侥加;

struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE; //存儲該類聲明遵守的協(xié)議的列表

#endif

}

2捧存、SEL

SEL是selector在Objective-C中的表示類型。selector可以理解為區(qū)別方法的ID。

typedef struct objc_selector *SEL;

struct objc_selector {

char *name;OBJC2_UNAVAILABLE;//名稱

char *types;OBJC2_UNAVAILABLE;//類型

};

3昔穴、IMP

typedef id (*IMP)(id, SEL, ...);

IMP是“implementation”的縮寫镰官,它是由編譯器生成的一個函數(shù)指針。當你發(fā)起一個消息后(下文介紹)傻咖,這個函數(shù)指針決定了最終執(zhí)行哪段代碼朋魔。

4Method

Method代表類中的某個方法的類型卿操。

typedef struct objc_method *Method;

struct objc_method {

SEL method_nameOBJC2_UNAVAILABLE; //方法名

char *method_typesOBJC2_UNAVAILABLE; //方法類型

IMP method_impOBJC2_UNAVAILABLE; //方法實現(xiàn)

}

方法名method_name類型為SEL警检,

方法類型method_types是一個char指針,存儲著方法的參數(shù)類型和返回值類型害淤。

方法實現(xiàn)method_imp的類型為IMP

5扇雕、Ivar

Ivar代表類中實例變量的類型

typedef struct objc_ivar *Ivar;

struct objc_ivar {

char *ivar_nameOBJC2_UNAVAILABLE; //變量名

char *ivar_typeOBJC2_UNAVAILABLE; //變量類型

int ivar_offsetOBJC2_UNAVAILABLE; //基地址偏移字節(jié)

#ifdef __LP64__

int spaceOBJC2_UNAVAILABLE; //占用空間

#endif

}

6objc_property_t

objc_property_t是屬性窥摄,它的定義如下:

typedef struct objc_property *objc_property_t;

objc_property是內置的類型镶奉,與之關聯(lián)的還有一個objc_property_attribute_t,它是屬性的attribute崭放,也就是其實是對屬性的詳細描述哨苛,包括屬性名稱、屬性編碼類型币砂、原子類型/非原子類型等建峭。它的定義如下:

typedef struct {

const char *name; //名稱

const char *value;//值(通常是空的)

} objc_property_attribute_t;

7Cache

Catch的定義如下:

typedef struct objc_cache *Cache

struct objc_cache {

unsigned int maskOBJC2_UNAVAILABLE;

unsigned int occupiedOBJC2_UNAVAILABLE;

Method buckets[1]OBJC2_UNAVAILABLE;

};

mask:指定分配cache buckets的總數(shù)决摧。在方法查找中亿蒸,Runtime使用這個字段確定數(shù)組的索引位置。

occupied:實際占用cache buckets的總數(shù)掌桩。

buckets:指定Method數(shù)據(jù)結構指針的數(shù)組边锁。這個數(shù)組可能包含不超過mask+1個元素。需要注意的是波岛,指針可能是NULL茅坛,表示這個緩存bucket沒有被占用,另外被占用的bucket可能是不連續(xù)的盆色。這個數(shù)組可能會隨著時間而增長灰蛙。

objc_msgSend(下文講解)每調用一次方法后,就會把該方法緩存到cache列表中隔躲,下次的時候,就直接優(yōu)先從cache列表中尋找物延,如果cache沒有宣旱,才從methodLists中查找方法。

8叛薯、Catagory

這個就是我們平時所說的類別了浑吟。它可以動態(tài)的為已存在的類添加新的方法

typedef struct objc_category *Category;

struct objc_category {

char *category_nameOBJC2_UNAVAILABLE; //類別名稱

char *class_nameOBJC2_UNAVAILABLE; //類名

struct objc_method_list *instance_methodsOBJC2_UNAVAILABLE; //實例方法列表

struct objc_method_list *class_methodsOBJC2_UNAVAILABLE; //類方法列表

struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE; //協(xié)議列表

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末笙纤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子组力,更是在濱河造成了極大的恐慌省容,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燎字,死亡現(xiàn)場離奇詭異腥椒,居然都是意外死亡,警方通過查閱死者的電腦和手機候衍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門笼蛛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛉鹿,你說我怎么就攤上這事滨砍。” “怎么了妖异?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵惋戏,是天一觀的道長。 經(jīng)常有香客問我他膳,道長响逢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任矩乐,我火速辦了婚禮龄句,結果婚禮上,老公的妹妹穿的比我還像新娘散罕。我一直安慰自己分歇,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布欧漱。 她就那樣靜靜地躺著职抡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪误甚。 梳的紋絲不亂的頭發(fā)上缚甩,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音窑邦,去河邊找鬼擅威。 笑死,一個胖子當著我的面吹牛冈钦,可吹牛的內容都是我干的郊丛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厉熟!你這毒婦竟也來了导盅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤揍瑟,失蹤者是張志新(化名)和其女友劉穎白翻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绢片,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡滤馍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杉畜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纪蜒。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖此叠,靈堂內的尸體忽然破棺而出纯续,到底是詐尸還是另有隱情,我是刑警寧澤灭袁,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布猬错,位于F島的核電站,受9級特大地震影響茸歧,放射性物質發(fā)生泄漏倦炒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一软瞎、第九天 我趴在偏房一處隱蔽的房頂上張望逢唤。 院中可真熱鬧,春花似錦涤浇、人聲如沸鳖藕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著恩。三九已至,卻和暖如春蜻展,著一層夾襖步出監(jiān)牢的瞬間喉誊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工纵顾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伍茄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓施逾,卻偏偏與公主長得像幻林,于是被迫代替她去往敵國和親贞盯。 傳聞我的和親對象是個殘疾皇子音念,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容

  • 我們常常會聽說 Objective-C 是一門動態(tài)語言沪饺,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,182評論 0 7
  • 轉至元數(shù)據(jù)結尾創(chuàng)建: 董瀟偉闷愤,最新修改于: 十二月 23, 2016 轉至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評論 0 9
  • 前言 runtime其實在我們日常開發(fā)過程中很少使用到整葡,尤其是像我現(xiàn)在比較初級的程序猿就更用不到了。但是去面試很多...
    WolfTin閱讀 616評論 0 2
  • 本文詳細整理了 Cocoa 的 Runtime 系統(tǒng)的知識讥脐,它使得 Objective-C 如虎添翼遭居,具備了靈活的...
    lylaut閱讀 795評論 0 4
  • runtime 運行時語言,實現(xiàn)Object-C的C語言庫旬渠,將OC轉換成C進行編譯的過渡者俱萍。 作為一門動態(tài)編程語言...
    夜雨聲煩_閱讀 544評論 0 0