Method 是方法的型別, typedef struct objc_method *Method;
struct objc_method {
SEL method_name OBJC2_UNAVAILABLE;
char *method_types OBJC2_UNAVAILABLE;
IMP method_imp OBJC2_UNAVAILABLE;
}
objc_method 儲存了方法的方法名(SEL method_name,相同名字的方法即使在不同類中定義,它們的方法選擇器也相同。),方法型別(char *method_types, char指標其實儲存著方法的引數型別和返回值型別)和方法實現(IMP method_imp)。
Ivar 是例項變數型別。typedef struct objc_ivar *Ivar;
objc_ivar 包含了變數名稱(char *ivar_name),變數型別(char *ivar_type),基地址偏移位元組(int ivar_offset)
struct objc_ivar {
char *ivar_name OBJC2_UNAVAILABLE;
char *ivar_type OBJC2_UNAVAILABLE;
int ivar_offset OBJC2_UNAVAILABLE;
#ifdef LP64
int space OBJC2_UNAVAILABLE;
#endif
}
class_copyIvarList函式獲取的不僅有例項變數,還有屬性。但會在原本的屬性名前加上一個下劃線。
IMP typedef id (*IMP)(id,SEL, ...);
當你發起Objc訊息,由這個函式指定執行程式碼。這個函式的指標指向了方法的實現。
Cache typedef struct objc_cache *Cache;
Cache為方法呼叫的效能進行優化,當例項物件收到訊息時優先訪問cache,找不到再去isa指向的類的方法列表遍歷查詢,找到後放到cache中。
Property 指向objc_property結構體
typedef struct objc_property *Property;
typedef struct objc_property *objc_property_t;//這個更常用
可以通過class_copyPropertyList和protocol_copyPropertyList方法來獲取類和協議中的屬性:
objc_property_t *class_copyPropertyList(Class cls,unsigned int *outCount)
objc_property_t *protocol_copyPropertyList(Protocol *proto,unsigned int *outCount)
返回型別為指向指標的指標,哈哈,因為屬性列表是個陣列,每個元素內容都是一個objc_property_t指標,而這兩個函式返回的值是指向這個陣列的指標。
class_copyPropertyList 獲取屬性列表
property_getName函式來查詢屬性名稱 :
const char *property_getName(objc_property_tproperty)
你可以用class_getProperty和protocol_getProperty通過給出的名稱來在類和協議中獲取屬性的引用:
objc_property_t class_getProperty(Class cls,const char *name)
objc_property_t protocol_getProperty(Protocol proto,const charname, BOOL isRequiredProperty, BOOL isInstanceProperty)
用property_getAttributes函式來發掘屬性的名稱和@encode型別字串:
const char *property_getAttributes(objc_property_tproperty)
class_copyIvarList函式,使用class_copyPropertyList函式只能獲取類的屬性,而不包含成員變數。但此時獲取的屬性名是不帶下劃線的。