IOS底層數(shù)據(jù)結(jié)構(gòu)

一、類的數(shù)據(jù)結(jié)構(gòu)

Class(指針)

typedef struct objc_class *Class;

/*
  這是由編譯器為每個(gè)類產(chǎn)生的數(shù)據(jù)結(jié)構(gòu),這個(gè)結(jié)構(gòu)定義了一個(gè)類.這個(gè)結(jié)構(gòu)是通過編譯器在執(zhí)行時(shí)產(chǎn)生,在運(yùn)行時(shí)發(fā)送消息時(shí)使用.因此,一些成員改變了類型.編譯器產(chǎn)生"char* const"類型的字符串指針替代了下面的成員變量"super_class"
*/
struct objc_class {
  struct objc_class*  class_pointer;    /* 指向元類的指針. */
  struct objc_class*  super_class;      /* 指向父類的指針. 對于NSObject來說是NULL.*/
  const char*         name;             /* 類的名稱. */
  long                version;          /* 未知. */
  unsigned long       info;             /* 比特蒙板.  參考下面類的蒙板定義. */
  long                instance_size;    /* 類的字節(jié)數(shù).包含類的定義和所有父類的定義 */
#ifdef _WIN64
  long pad;
#endif
  struct objc_ivar_list* ivars;         /* 指向類中定義的實(shí)例變量的列表結(jié)構(gòu). NULL代表沒有實(shí)例變量.不包括父類的變量. */
  struct objc_method_list*  methods;    /* 鏈接類中定義的實(shí)例方法. */
  struct sarray *    dtable;            /* 指向?qū)嵗椒ǚ峙浔? */
  struct objc_class* subclass_list;     /* 父類列表 */
  struct objc_class* sibling_class;
  struct objc_protocol_list *protocols; /* 要實(shí)現(xiàn)的原型列表 */
  void* gc_object_type;
};

Method(指針)

typedef struct objc_method *Method;

/* 編譯器依據(jù)類中定義的方法為該類產(chǎn)生一個(gè)或更多這種這種結(jié)構(gòu).
    一個(gè)類的實(shí)現(xiàn)可以分散在一個(gè)文件中不同部分,同時(shí)類別可以分散在不同的模塊中.為了處理這個(gè)問題,使用一個(gè)單獨(dú)的方法鏈表 */
struct objc_method
{
  SEL         method_name;  /* 這個(gè)變量就是方法的名稱.編譯器使用在這里使用一個(gè)`char*`,當(dāng)一個(gè)方法被注冊,名稱在運(yùn)行時(shí)被使用真正的SEL替代  */
  const char* method_types; /* 描述方法的參數(shù)列表. 在運(yùn)行時(shí)注冊選擇器時(shí)使用.那時(shí)候方法名就會包含方法的參數(shù)列表.*/
  IMP         method_imp;   /* 方法執(zhí)行時(shí)候的地址. */
};```

## Ivar(指針)

```objc
typedef struct objc_ivar *Ivar;

/* 編譯器依據(jù)類中定義的實(shí)例變量為該類產(chǎn)生一個(gè)或更多這種這種結(jié)構(gòu)  */
struct objc_ivar
{
  const char* ivar_name;  /* 類中定義的變量名. */
  const char* ivar_type;  /* 描述變量的類型.調(diào)試時(shí)非常有用. */
  int        ivar_offset; /* 實(shí)例結(jié)構(gòu)的基地址偏移字節(jié) */
};```

##Category(指針)

```objc
typedef struct objc_category *Category;

/* 編譯器為每個(gè)類別產(chǎn)生一個(gè)這樣的結(jié)構(gòu).一個(gè)類可以具有多個(gè)類別同時(shí)既包括實(shí)例方法,也可以包括類方法*/
struct objc_category
{
  const char*   category_name;                /* 類別名.定義在類別后面的括號內(nèi)*/
  const char*   class_name;                   /* 類名 */
  struct objc_method_list  *instance_methods; /* 鏈接類中定義的實(shí)例方法. NULL表示沒有實(shí)例方法. */
  struct objc_method_list *class_methods;     /* 鏈接類中定義的類方法. NULL表示沒有類方法. */
  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è)變量用來鏈接另一個(gè)單獨(dú)的方法鏈表 */
  int            method_count;            /* 結(jié)構(gòu)中定義的方法數(shù)量 */
  struct objc_method method_list[1];      /* 可變長度的結(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

```objc
struct objc_object
{
  // 類的指針是對象相關(guān)的類.如果是一個(gè)類對象, 這個(gè)指針指向元類.
  Class isa;
};```

## objc_super
```objc
struct objc_super
{
  id    self;        /* 消息的接受者  */
  Class super_class; /* 接受者的父類  */
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遍膜,一起剝皮案震驚了整個(gè)濱河市赊豌,隨后出現(xiàn)的幾起案子扛或,更是在濱河造成了極大的恐慌,老刑警劉巖碘饼,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熙兔,死亡現(xiàn)場離奇詭異,居然都是意外死亡艾恼,警方通過查閱死者的電腦和手機(jī)住涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠绍,“玉大人舆声,你說我怎么就攤上這事×” “怎么了媳握?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵碱屁,是天一觀的道長。 經(jīng)常有香客問我毙芜,道長,這世上最難降的妖魔是什么争拐? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任腋粥,我火速辦了婚禮,結(jié)果婚禮上架曹,老公的妹妹穿的比我還像新娘隘冲。我一直安慰自己,他們只是感情好绑雄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布展辞。 她就那樣靜靜地躺著,像睡著了一般万牺。 火紅的嫁衣襯著肌膚如雪罗珍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天脚粟,我揣著相機(jī)與錄音覆旱,去河邊找鬼。 笑死核无,一個(gè)胖子當(dāng)著我的面吹牛扣唱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播团南,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼噪沙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吐根?” 一聲冷哼從身側(cè)響起正歼,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拷橘,沒想到半個(gè)月后朋腋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膜楷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年旭咽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赌厅。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穷绵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出特愿,到底是詐尸還是另有隱情仲墨,我是刑警寧澤勾缭,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站目养,受9級特大地震影響俩由,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜癌蚁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一幻梯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧努释,春花似錦碘梢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逸邦,卻和暖如春恩沛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缕减。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工复唤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烛卧。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓佛纫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親总放。 傳聞我的和親對象是個(gè)殘疾皇子呈宇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,709評論 0 9
  • 一局雄、類的數(shù)據(jù)結(jié)構(gòu) Class(指針) typedef struct objc_class *Class; /* 這...
    NBeanN閱讀 610評論 0 4
  • 我們常常會聽說 Objective-C 是一門動(dòng)態(tài)語言甥啄,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,192評論 0 7
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 758評論 0 1
  • 1炬搭、狠厲 又對福娃發(fā)脾氣了蜈漓。 白天在學(xué)校,上課該完成的練習(xí)冊沒有寫宫盔,課后班我讓他寫一些計(jì)算題融虽,他也沒有寫。他說和人...
    勤儉簡閱讀 216評論 0 2