程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Objective-C底層數據結構

Objective-C底層數據結構

編輯:關於C語言

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

← 上一篇

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved