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函數(shù)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; //存儲該類聲明遵守的協(xié)議的列表
#endif
}
2捧存、SEL
SEL是selector在Objective-C中的表示類型。selector可以理解為區(qū)別方法的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”的縮寫镰官,它是由編譯器生成的一個函數(shù)指針。當你發(fā)起一個消息后(下文介紹)傻咖,這個函數(shù)指針決定了最終執(zhí)行哪段代碼朋魔。
4、Method
Method代表類中的某個方法的類型卿操。
typedef struct objc_method *Method;
struct objc_method {
SEL method_nameOBJC2_UNAVAILABLE; //方法名
char *method_typesOBJC2_UNAVAILABLE; //方法類型
IMP method_impOBJC2_UNAVAILABLE; //方法實現(xiàn)
}
方法名method_name類型為SEL警检,
方法類型method_types是一個char指針,存儲著方法的參數(shù)類型和返回值類型害淤。
方法實現(xiàn)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; //基地址偏移字節(jié)
#ifdef __LP64__
int spaceOBJC2_UNAVAILABLE; //占用空間
#endif
}
6、objc_property_t
objc_property_t是屬性窥摄,它的定義如下:
typedef struct objc_property *objc_property_t;
objc_property是內置的類型镶奉,與之關聯(lián)的還有一個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的總數(shù)决摧。在方法查找中亿蒸,Runtime使用這個字段確定數(shù)組的索引位置。
occupied:實際占用cache buckets的總數(shù)掌桩。
buckets:指定Method數(shù)據(jù)結構指針的數(shù)組边锁。這個數(shù)組可能包含不超過mask+1個元素。需要注意的是波岛,指針可能是NULL茅坛,表示這個緩存bucket沒有被占用,另外被占用的bucket可能是不連續(xù)的盆色。這個數(shù)組可能會隨著時間而增長灰蛙。
objc_msgSend(下文講解)每調用一次方法后,就會把該方法緩存到cache列表中隔躲,下次的時候,就直接優(yōu)先從cache列表中尋找物延,如果cache沒有宣旱,才從methodLists中查找方法。
8叛薯、Catagory
這個就是我們平時所說的類別了浑吟。它可以動態(tài)的為已存在的類添加新的方法
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; //協(xié)議列表
}