iOS 數(shù)據(jù)機(jī)構(gòu)(OC底層)

class

Class(指針)

typedef struct objc_class *Class;

由編譯器為每個(gè)類(lèi)產(chǎn)生的數(shù)據(jù)結(jié)構(gòu),這個(gè)結(jié)構(gòu)是通過(guò)編譯器在執(zhí)行時(shí)產(chǎn)生,在運(yùn)行時(shí)發(fā)送消息時(shí)使用.因此,一些成員改變了類(lèi)型.編譯器產(chǎn)生"char* const"類(lèi)型的字符串指針替代了下面的成員變量"super_class"

struct objc_class {

struct objc_class*? class_pointer;? ? /* 指向元類(lèi)的指針. */

struct objc_class*? super_class;? ? ? /* 指向父類(lèi)的指針. 對(duì)于NSObject來(lái)說(shuō)是NULL.*/

const char*? ? ? ? name;? ? ? ? ? ? /* 類(lèi)的名稱(chēng). */

long? ? ? ? ? ? ? ? version;? ? ? ? ? /* 未知. */

unsigned long? ? ? info;? ? ? ? ? ? /* 比特蒙板.? 參考下面類(lèi)的蒙板定義. */

long? ? ? ? ? ? ? ? instance_size;? ? /* 類(lèi)的字節(jié)數(shù).包含類(lèi)的定義和所有父類(lèi)的定義 */

#ifdef _WIN64

long pad;

#endif

struct objc_ivar_list* ivars;? ? ? ? /* 指向類(lèi)中定義的實(shí)例變量的列表結(jié)構(gòu). NULL代表沒(méi)有實(shí)例變量.不包括父類(lèi)的變量. */

struct objc_method_list*? methods;? ? /* 鏈接類(lèi)中定義的實(shí)例方法. */

struct sarray *? ? dtable;? ? ? ? ? ? /* 指向?qū)嵗椒ǚ峙浔? */

struct objc_class* subclass_list;? ? /* 父類(lèi)列表 */

struct objc_class* sibling_class;

struct objc_protocol_list *protocols; /* 要實(shí)現(xiàn)的原型列表 */

void* gc_object_type;

};

Method(指針)

typedef struct objc_method *Method;

/* 編譯器依據(jù)類(lèi)中定義的方法為該類(lèi)產(chǎn)生一個(gè)或更多這種這種結(jié)構(gòu).

一個(gè)類(lèi)的實(shí)現(xiàn)可以分散在一個(gè)文件中不同部分,同時(shí)類(lèi)別可以分散在不同的模塊中.為了處理這個(gè)問(wèn)題,使用一個(gè)單獨(dú)的方法鏈表 */

struct objc_method

{

SEL? ? ? ? method_name;? /* 這個(gè)變量就是方法的名稱(chēng).編譯器使用在這里使用一個(gè)`char*`,當(dāng)一個(gè)方法被注冊(cè),名稱(chēng)在運(yùn)行時(shí)被使用真正的SEL替代? */

const char* method_types; /* 描述方法的參數(shù)列表. 在運(yùn)行時(shí)注冊(cè)選擇器時(shí)使用.那時(shí)候方法名就會(huì)包含方法的參數(shù)列表.*/

IMP? ? ? ? method_imp;? /* 方法執(zhí)行時(shí)候的地址. */

};```

?Ivar(指針)

```objc

typedef struct objc_ivar *Ivar;

/* 編譯器依據(jù)類(lèi)中定義的實(shí)例變量為該類(lèi)產(chǎn)生一個(gè)或更多這種這種結(jié)構(gòu)? */

struct objc_ivar

{

const char* ivar_name;? /* 類(lèi)中定義的變量名. */

const char* ivar_type;? /* 描述變量的類(lèi)型.調(diào)試時(shí)非常有用. */

int? ? ? ? ivar_offset; /* 實(shí)例結(jié)構(gòu)的基地址偏移字節(jié) */

};```

Category(指針)

```objc

typedef struct objc_category *Category;

/* 編譯器為每個(gè)類(lèi)別產(chǎn)生一個(gè)這樣的結(jié)構(gòu).一個(gè)類(lèi)可以具有多個(gè)類(lèi)別同時(shí)既包括實(shí)例方法,也可以包括類(lèi)方法*/

struct objc_category

{

const char*? category_name;? ? ? ? ? ? ? ? /* 類(lèi)別名.定義在類(lèi)別后面的括號(hào)內(nèi)*/

const char*? class_name;? ? ? ? ? ? ? ? ? /* 類(lèi)名 */

struct objc_method_list? *instance_methods; /* 鏈接類(lèi)中定義的實(shí)例方法. NULL表示沒(méi)有實(shí)例方法. */

struct objc_method_list *class_methods;? ? /* 鏈接類(lèi)中定義的類(lèi)方法. NULL表示沒(méi)有類(lèi)方法. */

struct objc_protocol_list *protocols;? ? ? /* 遵循的協(xié)議表? */

};

objc_property_t

typedef struct objc_property *objc_property_t;

IMP

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

SEL

typedef struct objc_selector *SEL;

struct objc_selector

{

void *sel_id;

const char *sel_types;

};

objc_method_list

struct objc_method_list

{

struct objc_method_list*? method_next; /* 這個(gè)變量用來(lái)鏈接另一個(gè)單獨(dú)的方法鏈表 */

int? ? ? ? ? ? method_count;? ? ? ? ? ? /* 結(jié)構(gòu)中定義的方法數(shù)量 */

struct objc_method method_list[1];? ? ? /* 可變長(zhǎng)度的結(jié)構(gòu) */

};

objc_cache

struct objc_cache

{

unsigned int mask;

unsigned int occupied;

Method buckets[1];

};

objc_protocol_list

struct objc_protocol_list

{

struct objc_protocol_list *next;

size_t count;

struct objc_protocol *list[1];

};

二、實(shí)例的數(shù)據(jù)結(jié)構(gòu)

id

typedef struct objc_object *id;```

?objc_object

struct objc_object

{

// 類(lèi)的指針是對(duì)象相關(guān)的類(lèi).如果是一個(gè)類(lèi)對(duì)象, 這個(gè)指針指向元類(lèi).

Class isa;

};```

objc_super

struct objc_super

{

id? ? self;? ? ? ? /* 消息的接受者? */

Class super_class; /* 接受者的父類(lèi)? */

};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晌姚,一起剝皮案震驚了整個(gè)濱河市粤剧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挥唠,老刑警劉巖抵恋,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宝磨,居然都是意外死亡弧关,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)唤锉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)世囊,“玉大人,你說(shuō)我怎么就攤上這事窿祥≈旰叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嗤瞎。 經(jīng)常有香客問(wèn)我墙歪,道長(zhǎng),這世上最難降的妖魔是什么贝奇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任虹菲,我火速辦了婚禮,結(jié)果婚禮上掉瞳,老公的妹妹穿的比我還像新娘毕源。我一直安慰自己,他們只是感情好陕习,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布霎褐。 她就那樣靜靜地躺著,像睡著了一般衡查。 火紅的嫁衣襯著肌膚如雪瘩欺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天拌牲,我揣著相機(jī)與錄音,去河邊找鬼歌粥。 笑死塌忽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的失驶。 我是一名探鬼主播土居,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嬉探!你這毒婦竟也來(lái)了擦耀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涩堤,失蹤者是張志新(化名)和其女友劉穎眷蜓,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體胎围,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吁系,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了白魂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汽纤。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖福荸,靈堂內(nèi)的尸體忽然破棺而出蕴坪,到底是詐尸還是另有隱情,我是刑警寧澤敬锐,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布背传,位于F島的核電站捆等,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏续室。R本人自食惡果不足惜栋烤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挺狰。 院中可真熱鬧明郭,春花似錦、人聲如沸丰泊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞳购。三九已至话侄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間学赛,已是汗流浹背年堆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盏浇,地道東北人变丧。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绢掰,于是被迫代替她去往敵國(guó)和親痒蓬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355