Objective-C底層資料結構

來源:互聯網
上載者:User

標籤:objective-c底層資料結構

Objective-C底層資料結構

Objective-C底層資料結構

類的資料結構

Class(指標)
typedef struct objc_class *Class;  /*  這是由編譯器為每個類產生的資料結構,這個結構定義了一個類.這個結構是通過編譯器在執行時產生,在運行時發送訊息時使用.因此,一些成員改變了類型.編譯器產生"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;    /* 類的位元組數.包含類的定義和所有父類的定義 */#ifdef _WIN64  long pad;#endif  struct objc_ivar_list* ivars;         /* 指向類中定義的執行個體變數的列表結構. NULL代表沒有執行個體變數.不包括父類的變數. */  struct objc_method_list*  methods;    /* 連結類中定義的執行個體方法. */  struct sarray *    dtable;            /* 指向執行個體方法分配表. */   struct objc_class* subclass_list;     /* 父類列表 */  struct objc_class* sibling_class;  struct objc_protocol_list *protocols; /* 要實現的原型列表 */  void* gc_object_type;};
Method(指標)
typedef struct objc_method *Method;  /* 編譯器依據類中定義的方法為該類產生一個或更多這種這種結構.    一個類的實現可以分散在一個檔案中不同部分,同時類別可以分散在不同的模組中.為了處理這個問題,使用一個單獨的方法鏈表 */struct objc_method{  SEL         method_name;  /* 這個變數就是方法的名稱.編譯器使用在這裡使用一個`char*`,當一個方法被註冊,名稱在運行時被使用真正的SEL替代  */  const char* method_types; /* 描述方法的參數列表. 在運行時註冊選取器時使用.那時候方法名就會包含方法的參數列表.*/  IMP         method_imp;   /* 方法執行時候的地址. */};
Ivar(指標)
typedef struct objc_ivar *Ivar;  /* 編譯器依據類中定義的執行個體變數為該類產生一個或更多這種這種結構  */struct objc_ivar{  const char* ivar_name;  /* 類中定義的變數名. */  const char* ivar_type;  /* 描述變數的類型.調試時非常有用. */  int        ivar_offset; /* 執行個體結構的基地址位移位元組 */};
Category(指標)
typedef struct objc_category *Category;  /* 編譯器為每個類別產生一個這樣的結構.一個類可以具有多個類別同時既包括執行個體方法,也可以包括類方法*/struct objc_category{  const char*   category_name;                /* 類別名.定義在類別後面的括弧內*/  const char*   class_name;                   /* 類名 */  struct objc_method_list  *instance_methods; /* 連結類中定義的執行個體方法. NULL表示沒有執行個體方法. */  struct objc_method_list *class_methods;     /* 連結類中定義的類方法. NULL表示沒有類方法. */  struct objc_protocol_list *protocols;       /* 遵循的協議表  */};
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; /* 這個變數用來連結另一個單獨的方法鏈表 */  int            method_count;            /* 結構中定義的方法數量 */  struct objc_method method_list[1];      /* 可變長度的結構 */};
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];};
執行個體的資料結構id
typedef struct objc_object *id;
objc_object
struct objc_object{  /* 類的指標是對象相關的類.如果是一個類對象, 這個指標指向元類.  Class isa;};
objc_super
struct objc_super{  id    self;        /* 訊息的接受者  */  Class super_class; /* 接受者的父類  */};

← 上一篇

Objective-C底層資料結構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.