標籤: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底層資料結構