Objective-C底層數據結構

jopen 10年前發布 | 27K 次閱讀 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; };</pre>

Method(指針)

typedef struct objc_method Method;
       
/ 編譯器依據類中定義的方法為該類產生一個或更多這種這種結構.
    一個類的實現可以分散在一個文件中不同部分,同時類別可以分散在不同的模塊中.為了處理這個問題,使用一個單獨的方法鏈表 /
struct objc_method
{
  SEL         method_name;  / 這個變量就是方法的名稱.編譯器使用在這里使用一個`char`,當一個方法被注冊,名稱在運行時被使用真正的SEL替代  /
  const char method_types; / 描述方法的參數列表. 在運行時注冊選擇器時使用.那時候方法名就會包含方法的參數列表./
  IMP         method_imp;   / 方法執行時候的地址. /
};</pre>  

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; /* 接受者的父類  */
};

 來自:http://iostour.diandian.com/post/2013-01-16/40047469315

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!