類的數據結構
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;
};
typedef struct objc_method *Method;
/* 編譯器依據類中定義的方法為該類產生一個或更多這種這種結構.
一個類的實現可以分散在一個文件中不同部分,同時類別可以分散在不同的模塊中.為了處理這個問題,使用一個單獨的方法鏈表 */
struct objc_method
{
SEL method_name; /* 這個變量就是方法的名稱.編譯器使用在這裡使用一個`char*`,當一個方法被注冊,名稱在運行時被使用真正的SEL替代 */
const char* method_types; /* 描述方法的參數列表. 在運行時注冊選擇器時使用.那時候方法名就會包含方法的參數列表.*/
IMP method_imp; /* 方法執行時候的地址. */
};
typedef struct objc_ivar *Ivar;
/* 編譯器依據類中定義的實例變量為該類產生一個或更多這種這種結構 */
struct objc_ivar
{
const char* ivar_name; /* 類中定義的變量名. */
const char* ivar_type; /* 描述變量的類型.調試時非常有用. */
int ivar_offset; /* 實例結構的基地址偏移字節 */
};
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; /* 遵循的協議表 */
};
typedef struct objc_property *objc_property_t;
id (*IMP)(id, SEL, ...)
typedef struct objc_selector *SEL;
struct objc_selector
{
void *sel_id;
const char *sel_types;
};
struct objc_method_list
{
struct objc_method_list* method_next; /* 這個變量用來鏈接另一個單獨的方法鏈表 */
int method_count; /* 結構中定義的方法數量 */
struct objc_method method_list[1]; /* 可變長度的結構 */
};
struct objc_cache
{
unsigned int mask;
unsigned int occupied;
Method buckets[1];
};
struct objc_protocol_list
{
struct objc_protocol_list *next;
size_t count;
struct objc_protocol *list[1];
};
typedef struct objc_object *id;
struct objc_object
{
/* 類的指針是對象相關的類.如果是一個類對象, 這個指針指向元類.
Class isa;
};
struct objc_super
{
id self; /* 消息的接受者 */
Class super_class; /* 接受者的父類 */
};
← 上一篇