1、id、class指針
class指針只向objc_class結構體
id指針只向objc_object結構體
isa是一個指向objc_class結構體(該對象所屬的類)
id是對象,class是類
struct objc_object {
Class isaOBJC_ISA_AVAILABILITY;
};
objc_class的定義如下
typedef struct objc_class *Class;
struct objc_class {
Class isaOBJC_ISA_AVAILABILITY; // metaclass
#if !__OBJC2__
Class super_classOBJC2_UNAVAILABLE; //父類
const char *nameOBJC2_UNAVAILABLE; //類名
long versionOBJC2_UNAVAILABLE; //類的版本信息,默認為0,可以通過runtime函數class_setVersion或者class_getVersion進行修改、讀取
long infoOBJC2_UNAVAILABLE; //類信息,供運行時期使用的一些位標識,如CLS_CLASS (0x1L)表示該類為普通class,其中包含實例方法和變量;CLS_META (0x2L)表示該類為metaclass,其中包含類方法;
long instance_sizeOBJC2_UNAVAILABLE; //該類的實例變量大?。ò◤母割惱^承下來的實例變量)
struct objc_ivar_list *ivarsOBJC2_UNAVAILABLE; //該類的成員變量地址列表
struct objc_method_list **methodListsOBJC2_UNAVAILABLE; //方法地址列表,與info的一些標志位有關,如CLS_CLASS (0x1L),則存儲實例方法,如CLS_META (0x2L),則存儲類方法;
struct objc_cache *cacheOBJC2_UNAVAILABLE; //緩存最近使用的方法地址,用于提升效率;
struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE; //存儲該類聲明遵守的協議的列表
#endif
}
2、SEL
SEL是selector在Objective-C中的表示類型。selector可以理解為區別方法的ID。
typedef struct objc_selector *SEL;
struct objc_selector {
char *name;OBJC2_UNAVAILABLE;//名稱
char *types;OBJC2_UNAVAILABLE;//類型
};
3、IMP
typedef id (*IMP)(id, SEL, ...);
IMP是“implementation”的縮寫,它是由編譯器生成的一個函數指針。當你發起一個消息后(下文介紹),這個函數指針決定了最終執行哪段代碼。
4、Method
Method代表類中的某個方法的類型。
typedef struct objc_method *Method;
struct objc_method {
SEL method_nameOBJC2_UNAVAILABLE; //方法名
char *method_typesOBJC2_UNAVAILABLE; //方法類型
IMP method_impOBJC2_UNAVAILABLE; //方法實現
}
方法名method_name類型為SEL,
方法類型method_types是一個char指針,存儲著方法的參數類型和返回值類型。
方法實現method_imp的類型為IMP
5、Ivar
Ivar代表類中實例變量的類型
typedef struct objc_ivar *Ivar;
struct objc_ivar {
char *ivar_nameOBJC2_UNAVAILABLE; //變量名
char *ivar_typeOBJC2_UNAVAILABLE; //變量類型
int ivar_offsetOBJC2_UNAVAILABLE; //基地址偏移字節
#ifdef __LP64__
int spaceOBJC2_UNAVAILABLE; //占用空間
#endif
}
6、objc_property_t
objc_property_t是屬性,它的定義如下:
typedef struct objc_property *objc_property_t;
objc_property是內置的類型,與之關聯的還有一個objc_property_attribute_t,它是屬性的attribute,也就是其實是對屬性的詳細描述,包括屬性名稱、屬性編碼類型、原子類型/非原子類型等。它的定義如下:
typedef struct {
const char *name; //名稱
const char *value;//值(通常是空的)
} objc_property_attribute_t;
7、Cache
Catch的定義如下:
typedef struct objc_cache *Cache
struct objc_cache {
unsigned int maskOBJC2_UNAVAILABLE;
unsigned int occupiedOBJC2_UNAVAILABLE;
Method buckets[1]OBJC2_UNAVAILABLE;
};
mask:指定分配cache buckets的總數。在方法查找中,Runtime使用這個字段確定數組的索引位置。
occupied:實際占用cache buckets的總數。
buckets:指定Method數據結構指針的數組。這個數組可能包含不超過mask+1個元素。需要注意的是,指針可能是NULL,表示這個緩存bucket沒有被占用,另外被占用的bucket可能是不連續的。這個數組可能會隨著時間而增長。
objc_msgSend(下文講解)每調用一次方法后,就會把該方法緩存到cache列表中,下次的時候,就直接優先從cache列表中尋找,如果cache沒有,才從methodLists中查找方法。
8、Catagory
這個就是我們平時所說的類別了。它可以動態的為已存在的類添加新的方法
typedef struct objc_category *Category;
struct objc_category {
char *category_nameOBJC2_UNAVAILABLE; //類別名稱
char *class_nameOBJC2_UNAVAILABLE; //類名
struct objc_method_list *instance_methodsOBJC2_UNAVAILABLE; //實例方法列表
struct objc_method_list *class_methodsOBJC2_UNAVAILABLE; //類方法列表
struct objc_protocol_list *protocolsOBJC2_UNAVAILABLE; //協議列表
}